markers for each ciliated population:
E16_Dec_epi_res12_8over1011<-FindMarkers(E16_Dec7v3_epi,ident.1=c(8),ident.2 = c(10,11),only.pos = TRUE)
E16_Dec_epi_res12_8over1011
write.table(E16_Dec_epi_res12_8over1011,"epiSubset_c8inCilia.txt",sep="\t")
E16_Dec_epi_res12_10over811<-FindMarkers(E16_Dec7v3_epi,ident.1=c(10),ident.2 = c(8,11),only.pos = TRUE)
E16_Dec_epi_res12_10over811
E16_Dec_epi_res12_10over8<-FindMarkers(E16_Dec7v3_epi,ident.1=c(10),ident.2 = c(8),only.pos = TRUE)
E16_Dec_epi_res12_10over8
write.table(E16_Dec_epi_res12_10over8,"epiSubset_c10overC8.txt",sep="\t")
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.2")
E16_Dec_epi_res12_10over11<-FindMarkers(E16_Dec7v3_epi,ident.1=c(10),ident.2 = c(11),only.pos = TRUE)
E16_Dec_epi_res12_10over11
write.table(E16_Dec_epi_res12_10over11,"epiSubset_c10overC11.txt",sep="\t")
E16_Dec_epi_res12_11over810<-FindMarkers(E16_Dec7v3_epi,ident.1=c(11),ident.2 = c(8,10),only.pos = TRUE)
E16_Dec_epi_res12_11over810
write.table(E16_Dec_epi_res12_11over810,"epiSubset_c11inCilia.txt",sep="\t")
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.2")
DoHeatmap(object = E16_Dec7v3_epi, genes.use = c("Foxj1","Top2a","Mcidas","Ccno","Foxn4","Shisa8","Lrrc23","Prr18","Cfap53","Cdhr3","Sntn","Ifitm1","Lbp","Ly6c1","Ly6a"),
slim.col.label = TRUE, group.label.rot = TRUE,use.scaled = F,cells.use = E16_Dec7v3_epi@cell.names[E16_Dec7v3_epi@meta.data$res.1.2 %in% c(8,10,11)],group.order = c(8,10,11),group.cex = 30,cex.row = 20
)

scoring:
E16_Dec7v3_epi@data[1:6,1:6]
percentile_table_epi<-apply(E16_Dec7v3_epi@data,1,percent_rank)
percentile_table_epi[1:6,1:6]
OMIMgene<-read.csv(file = "genesOMIM.csv",header=T,sep=",",stringsAsFactors = F)
OMIMgene<-lapply(OMIMgene,function(x) unlist(strsplit(unlist(x),split=",")))
head(OMIMgene$Mucociliary)
OMIMgene_mucosaGoblet<-as.vector(read.csv(file = "genesOMIM_mucosa_goblet.csv",header=T,sep=",",stringsAsFactors = F)[,1])
OMIMgene_mucosaGoblet<-unlist(strsplit(unlist(OMIMgene_mucosaGoblet),split=","))
OMIMgene_mucosaGoblet[90:105]
mocosaGoblet_score<- apply(percentile_table_epi[,colnames(percentile_table_epi) %in% OMIMgene_mucosaGoblet],1,mean)
head( mocosaGoblet_score)
E16_Dec7v3_epi<-AddMetaData(object = E16_Dec7v3_epi, metadata = mocosaGoblet_score, col.name = "mocosaGoblet_score")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("mocosaGoblet_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.4")
ciliopathy_table<- percentile_table_epi[,colnames(percentile_table_epi) %in% OMIMgene$Ciliopathy]
ciliopathy_score<- apply(ciliopathy_table,1,mean)
head(ciliopathy_score)
PCD_score<- apply(percentile_table_epi[,colnames(percentile_table_epi) %in% OMIMgene$Primary.ciliary.dyskinesia],1,mean)
head(PCD_score)
E16_Dec7v3_epi<-AddMetaData(object = E16_Dec7v3_epi, metadata = ciliopathy_score, col.name = "ciliopathy_score")
E16_Dec7v3_epi<-AddMetaData(object = E16_Dec7v3_epi, metadata = PCD_score, col.name = "PCD_score")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("ciliopathy_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.2")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("PCD_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.2")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("PCD_score"), nCol = 1,ident.include = c(8,10,11),x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.2")
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.2")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("ciliopathy_score"), ident.include = c(11),nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="seq_group")
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.2")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("PCD_score"), ident.include = c(8),nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="seq_group")
mucus_score<- apply(percentile_table_epi[,colnames(percentile_table_epi) %in% c(OMIMgene$Airway...Mucus,OMIMgene$Pulmonary.and.Mucus)],1,mean)
head(mucus_score)
E16_Dec7v3_epi<-AddMetaData(object = E16_Dec7v3_epi, metadata = mucus_score, col.name = "mucus_score")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("mucus_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.4")
COPD_score<- apply(percentile_table_epi[,colnames(percentile_table_epi) %in% c(OMIMgene$COPD)],1,mean)
head(COPD_score)
E16_Dec7v3_epi<-AddMetaData(object = E16_Dec7v3_epi, metadata = COPD_score, col.name = "COPD_score")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("COPD_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.4")
asthma_score<- apply(percentile_table_epi[,colnames(percentile_table_epi) %in% c(OMIMgene$Pulmonary...Asthma)],1,mean)
head(asthma_score)
E16_Dec7v3_epi<-AddMetaData(object = E16_Dec7v3_epi, metadata = asthma_score, col.name = "asthma_score")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("asthma_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.4")
ggplot(E16_Dec7v3_epi@meta.data,aes(genotype,asthma_score))+facet_grid(.~res.1.2)+geom_dotplot(binaxis="y",aes(color=genotype,fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1),
geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1))
res.used <- 1.4
E16_Dec7v3_epi <- FindClusters(object = E16_Dec7v3_epi, reduction.type = "pca", dims.use = 1:n.pcs.sub,
resolution = res.used, print.output = 0, force.recalc = T)
E16_Dec7v3_epi <- RunTSNE(object = E16_Dec7v3_epi, dims.use = 1:n.pcs.sub, perplexity=30)

E16_Dec7v3_epi=buildClusterTree(E16_Dec7v3_epi,do.reorder = F,reorder.numeric = F,pcs.use = 1:17)
table(E16_Dec7v3_epi@meta.data$res.1.4,E16_Dec7v3_epi@meta.data$seq_group)
prop.table(table(E16_Dec7v3_epi@meta.data$res.1.4,E16_Dec7v3_epi@meta.data$seq_group),2)
E16_Dec7_mut_7 E16_Dec7_mut_8 E16_Dec7_wt_1 E16_Dec7_wt_6
0 0.032475749 0.059523810 0.242384964 0.153679654
1 0.113454239 0.068948413 0.099157485 0.145743146
10 0.021931674 0.095238095 0.032404407 0.014430014
11 0.050611556 0.028273810 0.036292936 0.048340548
12 0.043441586 0.033730159 0.036292936 0.041125541
13 0.032053986 0.026289683 0.043421905 0.028860029
14 0.024040489 0.039682540 0.014906027 0.038239538
15 0.051455082 0.022321429 0.005832793 0.014430014
16 0.009700548 0.041666667 0.011665587 0.041847042
17 0.029523408 0.024305556 0.002592353 0.020923521
18 0.012652889 0.011904762 0.009073234 0.012987013
2 0.099114298 0.112599206 0.050550875 0.084415584
3 0.074230283 0.051091270 0.106934543 0.093073593
4 0.088570224 0.096726190 0.053143227 0.057720058
5 0.043019823 0.086805556 0.079066753 0.059884560
6 0.147195276 0.023809524 0.030460143 0.023809524
7 0.060733868 0.041666667 0.059624109 0.043290043
8 0.014339941 0.082837302 0.053791316 0.046176046
9 0.051455082 0.052579365 0.032404407 0.031024531


E16_Dec7v3_epi@meta.data$cell_type<-mapvalues(E16_Dec7v3_epi@meta.data$res.1.4,from=c("0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18"),to=c("Basal","Basal","Secretory","Basal/Secretory","Secretory","Secretory","Secretory","Ciliated","Secretory","Secretory","Secretory","Ciliated","Secretory","Basal","Doublet","Ciliated","Secretory","Doublet","Doublet"))
c14, 17 and c18 are doublets.


table(E16_Dec7v3_epi@meta.data$cell_type[!(E16_Dec7v3_epi@meta.data$res.1.4 %in% c(14,17,18))],E16_Dec7v3_epi@meta.data$genotype[!(E16_Dec7v3_epi@meta.data$res.1.4 %in% c(14,17,18))])
mut wt
Basal 734 1049
Basal/Secretory 279 294
Ciliated 572 304
Secretory 2492 1141
DE_E16_secretory_genotype<-FindMarkers(E16_Dec7v3_epi,cells.1<-WhichCells(object=E16_Dec7v3_epi,cells.use = (E16_Dec7v3_epi@meta.data$genotype=="wt" & E16_Dec7v3_epi@meta.data$cell_type=="Secretory" )),cells.2<-WhichCells(object=E16_Dec7v3_epi,cells.use = (E16_Dec7v3_epi@meta.data$genotype=="mut" & E16_Dec7v3_epi@meta.data$cell_type=="Secretory" )),only.pos = F,logfc.threshold=0,min.pct=0)
| | 0 % ~calculating
|+ | 1 % ~30m 46s
|+ | 2 % ~30m 22s
|++ | 3 % ~30m 21s
|++ | 4 % ~30m 15s
|+++ | 5 % ~29m 42s
|+++ | 6 % ~29m 17s
|++++ | 7 % ~28m 51s
|++++ | 8 % ~28m 30s
|+++++ | 9 % ~28m 06s
|+++++ | 10% ~27m 47s
|++++++ | 11% ~27m 28s
|++++++ | 12% ~27m 08s
|+++++++ | 13% ~26m 51s
|+++++++ | 14% ~26m 32s
|++++++++ | 15% ~26m 14s
|++++++++ | 16% ~25m 55s
|+++++++++ | 17% ~25m 37s
|+++++++++ | 18% ~25m 17s
|++++++++++ | 19% ~24m 58s
|++++++++++ | 20% ~24m 43s
|+++++++++++ | 21% ~24m 25s
|+++++++++++ | 22% ~24m 07s
|++++++++++++ | 23% ~23m 51s
|++++++++++++ | 24% ~23m 31s
|+++++++++++++ | 25% ~23m 12s
|+++++++++++++ | 26% ~22m 52s
|++++++++++++++ | 27% ~22m 34s
|++++++++++++++ | 28% ~22m 15s
|+++++++++++++++ | 29% ~21m 55s
|+++++++++++++++ | 30% ~21m 37s
|++++++++++++++++ | 31% ~21m 18s
|++++++++++++++++ | 32% ~20m 59s
|+++++++++++++++++ | 33% ~20m 40s
|+++++++++++++++++ | 34% ~20m 22s
|++++++++++++++++++ | 35% ~20m 04s
|++++++++++++++++++ | 36% ~19m 46s
|+++++++++++++++++++ | 37% ~19m 28s
|+++++++++++++++++++ | 38% ~19m 10s
|++++++++++++++++++++ | 39% ~18m 51s
|++++++++++++++++++++ | 40% ~18m 33s
|+++++++++++++++++++++ | 41% ~18m 15s
|+++++++++++++++++++++ | 42% ~17m 57s
|++++++++++++++++++++++ | 43% ~17m 38s
|++++++++++++++++++++++ | 44% ~17m 19s
|+++++++++++++++++++++++ | 45% ~17m 01s
|+++++++++++++++++++++++ | 46% ~16m 42s
|++++++++++++++++++++++++ | 47% ~16m 24s
|++++++++++++++++++++++++ | 48% ~16m 05s
|+++++++++++++++++++++++++ | 49% ~15m 46s
|+++++++++++++++++++++++++ | 50% ~15m 27s
|++++++++++++++++++++++++++ | 51% ~15m 08s
|++++++++++++++++++++++++++ | 52% ~14m 50s
|+++++++++++++++++++++++++++ | 53% ~14m 31s
|+++++++++++++++++++++++++++ | 54% ~14m 13s
|++++++++++++++++++++++++++++ | 55% ~13m 54s
|++++++++++++++++++++++++++++ | 56% ~13m 35s
|+++++++++++++++++++++++++++++ | 57% ~13m 17s
|+++++++++++++++++++++++++++++ | 58% ~12m 58s
|++++++++++++++++++++++++++++++ | 59% ~12m 40s
|++++++++++++++++++++++++++++++ | 60% ~12m 22s
|+++++++++++++++++++++++++++++++ | 61% ~12m 03s
|+++++++++++++++++++++++++++++++ | 62% ~11m 45s
|++++++++++++++++++++++++++++++++ | 63% ~11m 26s
|++++++++++++++++++++++++++++++++ | 64% ~11m 08s
|+++++++++++++++++++++++++++++++++ | 65% ~10m 49s
|+++++++++++++++++++++++++++++++++ | 66% ~10m 31s
|++++++++++++++++++++++++++++++++++ | 67% ~10m 12s
|++++++++++++++++++++++++++++++++++ | 68% ~09m 53s
|+++++++++++++++++++++++++++++++++++ | 69% ~09m 35s
|+++++++++++++++++++++++++++++++++++ | 70% ~09m 16s
|++++++++++++++++++++++++++++++++++++ | 71% ~08m 58s
|++++++++++++++++++++++++++++++++++++ | 72% ~08m 39s
|+++++++++++++++++++++++++++++++++++++ | 73% ~08m 20s
|+++++++++++++++++++++++++++++++++++++ | 74% ~08m 02s
|++++++++++++++++++++++++++++++++++++++ | 75% ~07m 43s
|++++++++++++++++++++++++++++++++++++++ | 76% ~07m 25s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~07m 06s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~06m 48s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~06m 29s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~06m 11s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~05m 53s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~05m 34s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~05m 15s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~04m 57s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~04m 38s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~04m 20s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~04m 01s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~03m 42s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~03m 24s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~03m 05s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~02m 47s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~02m 28s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~02m 10s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~01m 51s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~01m 33s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~01m 14s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~56s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~37s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~19s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 30m 50s
DE_E16_secretory_genotype
library(ggrepel)
DE_E16_secretory_genotype$gene<-rownames(DE_E16_secretory_genotype)
DE_E16_secretory_genotype$sig<-DE_E16_secretory_genotype$p_val_adj<0.001
volc = ggplot(DE_E16_secretory_genotype, aes(avg_logFC, -log10(p_val_adj))) + #volcanoplot with avg_logFC versus p_val_adj
geom_point(aes(col=sig)) + #add points colored by significance
scale_color_manual(values=c("black", "red")) +
ggtitle("E16secretory_wt/mut") + geom_text_repel(data=head(DE_E16_secretory_genotype, 20), aes(label=gene), point.padding = 1, box.padding = .3) +
labs(y = expression(-log[10]*" "*"adjusted pvalue"), x = "avg log fold change") +
theme(legend.title = element_blank(), legend.position = "top") +
scale_fill_discrete(labels = c("Not Sig", "adjusted pval < 0.001"))
volc

E16_Dec7v3_epi@meta.data$specific_type<-mapvalues(E16_Dec7v3_epi@meta.data$res.1.4,from=c("0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18"),to=c("Basal-Krt14","Basal","Secretory-Krt4","Basal/Secretory","Secretory-Krt4","Secretory","Secretory-Krt4","Ciliated","Secretory","Secretory-Krt4","Secretory-Krt4","Ciliated","CyclingSecretory","CyclingBasal","Doublet","Ciliated","Secretory","Doublet","Doublet"))
table(E16_Dec7v3_epi@meta.data$specific_type[!(E16_Dec7v3_epi@meta.data$res.1.4 %in% c(14,17,18))],E16_Dec7v3_epi@meta.data$genotype[!(E16_Dec7v3_epi@meta.data$res.1.4 %in% c(14,17,18))])
mut wt
Basal 408 355
Basal/Secretory 279 294
Basal-Sostdc1 197 587
Ciliated 572 304
CyclingBasal 129 107
CyclingSecretory 171 113
Secretory 585 428
Secretory-Krt4 1736 600

different populations of basal cells:
write.table(E16_Dec_epi_res14_0over1,"epiSubset_res14_c0overC1.txt",sep="\t")
library(ggrepel)
E16_Dec_epi_res14_0over1$gene<-rownames(E16_Dec_epi_res14_0over1)
E16_Dec_epi_res14_0over1$sig<-E16_Dec_epi_res14_0over1$p_val_adj<0.001
volc = ggplot(E16_Dec_epi_res14_0over1, aes(avg_logFC, -log10(p_val_adj))) + #volcanoplot with avg_logFC versus p_val_adj
geom_point(aes(col=sig)) + #add points colored by significance
scale_color_manual(values=c("black", "red")) +
ggtitle("E16_epi_0over1")
E16_Dec_epi_res14_0over1_volc.1 <- volc + geom_text_repel(data=head(E16_Dec_epi_res14_0over1, 20), aes(label=gene), point.padding = 1, box.padding = .3) +
labs(y = expression(-log[10]*" "*"adjusted pvalue"), x = "avg log fold change") +
theme(legend.title = element_blank(), legend.position = "top") +
scale_fill_discrete(labels = c("Not Sig", "adjusted pval < 0.001"))

E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.4")
E16_Dec_epi_res14_1over0<-FindMarkers(E16_Dec7v3_epi,ident.1=c(1),ident.2 = c(0),only.pos = TRUE)
| | 0 % ~calculating
|+ | 1 % ~05s
|++ | 3 % ~05s
|++ | 4 % ~04s
|+++ | 5 % ~03s
|++++ | 6 % ~03s
|++++ | 8 % ~03s
|+++++ | 9 % ~03s
|++++++ | 10% ~03s
|++++++ | 11% ~02s
|+++++++ | 13% ~02s
|+++++++ | 14% ~02s
|++++++++ | 15% ~02s
|+++++++++ | 16% ~02s
|+++++++++ | 18% ~02s
|++++++++++ | 19% ~02s
|+++++++++++ | 20% ~02s
|+++++++++++ | 22% ~02s
|++++++++++++ | 23% ~02s
|+++++++++++++ | 24% ~02s
|+++++++++++++ | 25% ~02s
|++++++++++++++ | 27% ~02s
|++++++++++++++ | 28% ~02s
|+++++++++++++++ | 29% ~02s
|++++++++++++++++ | 30% ~02s
|++++++++++++++++ | 32% ~02s
|+++++++++++++++++ | 33% ~02s
|++++++++++++++++++ | 34% ~02s
|++++++++++++++++++ | 35% ~02s
|+++++++++++++++++++ | 37% ~01s
|+++++++++++++++++++ | 38% ~01s
|++++++++++++++++++++ | 39% ~01s
|+++++++++++++++++++++ | 41% ~01s
|+++++++++++++++++++++ | 42% ~01s
|++++++++++++++++++++++ | 43% ~01s
|+++++++++++++++++++++++ | 44% ~01s
|+++++++++++++++++++++++ | 46% ~01s
|++++++++++++++++++++++++ | 47% ~01s
|+++++++++++++++++++++++++ | 48% ~01s
|+++++++++++++++++++++++++ | 49% ~01s
|++++++++++++++++++++++++++ | 51% ~01s
|++++++++++++++++++++++++++ | 52% ~01s
|+++++++++++++++++++++++++++ | 53% ~01s
|++++++++++++++++++++++++++++ | 54% ~01s
|++++++++++++++++++++++++++++ | 56% ~01s
|+++++++++++++++++++++++++++++ | 57% ~01s
|++++++++++++++++++++++++++++++ | 58% ~01s
|++++++++++++++++++++++++++++++ | 59% ~01s
|+++++++++++++++++++++++++++++++ | 61% ~01s
|++++++++++++++++++++++++++++++++ | 62% ~01s
|++++++++++++++++++++++++++++++++ | 63% ~01s
|+++++++++++++++++++++++++++++++++ | 65% ~01s
|+++++++++++++++++++++++++++++++++ | 66% ~01s
|++++++++++++++++++++++++++++++++++ | 67% ~01s
|+++++++++++++++++++++++++++++++++++ | 68% ~01s
|+++++++++++++++++++++++++++++++++++ | 70% ~01s
|++++++++++++++++++++++++++++++++++++ | 71% ~01s
|+++++++++++++++++++++++++++++++++++++ | 72% ~01s
|+++++++++++++++++++++++++++++++++++++ | 73% ~01s
|++++++++++++++++++++++++++++++++++++++ | 75% ~01s
|++++++++++++++++++++++++++++++++++++++ | 76% ~01s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~01s
|++++++++++++++++++++++++++++++++++++++++ | 78% ~01s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~00s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 86% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02s
E16_Dec_epi_res14_1over0
write.table(E16_Dec_epi_res14_1over0,"epiSubset_res14_c1overC0.txt",sep="\t")
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.4")
E16_Dec_epi_res14_9over1<-FindMarkers(E16_Dec7v3_epi,ident.1=c(9),ident.2 = c(1),only.pos = TRUE)
E16_Dec_epi_res14_9over1
write.table(E16_Dec_epi_res14_9over1,"epiSubset_res14_c9overC1.txt",sep="\t")
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.4")
E16_Dec_epi_res14_1over9<-FindMarkers(E16_Dec7v3_epi,ident.1=c(1),ident.2 = c(9),only.pos = TRUE)
E16_Dec_epi_res14_1over9
write.table(E16_Dec_epi_res14_1over9,"epiSubset_res14_c1overC9.txt",sep="\t")

different populations of ciliated cells:

different populations of secretory cells:

Sostdc1 seems to be downregulated in mutant basal-Sostdc1 population.
epi_marker_c0_mut_wt<-FindMarkers(E16_Dec7v3_epi,cells.1<-WhichCells(object=E16_Dec7v3_epi,ident=0,cells.use = E16_Dec7v3_epi@meta.data$genotype=="mut"),cells.2<-WhichCells(object=E16_Dec7v3_epi,ident=0,cells.use = E16_Dec7v3_epi@meta.data$genotype=="wt"),only.pos = TRUE)
epi_marker_c0_mut_wt
E16_Dec7v3_epi@meta.data$type_genotype<-as.factor(paste(E16_Dec7v3_epi@meta.data$cell_type,E16_Dec7v3_epi@meta.data$genotype,sep="_"))


E16_Dec7v3_epi<-SetAllIdent(object = E16_Dec7v3_epi, id = "type_genotype")
E16_Dec7v3_epi@ident=factor(E16_Dec7v3_epi@ident,levels(E16_Dec7v3_epi@ident)[c(1,4,2,3,9,10,5,6,7,8)])
DotPlot(object = E16_Dec7v3_epi, cols.use = c("forestgreen","magenta3"),genes.plot = rev(c("Nfkbia","Nfkbiz","Retnla","Cxcl17","Cxcl15","Ccl20","Areg","Muc5b","Muc4","Pigr","Ltf","Lyz2","Slpi","Lcn2","Sftpd","Sftpb","Defb1","Lgals3","Itln1")),x.lab.rot = T,plot.legend = T,group.by = "ident",do.return=T,col.min = -2,col.max = 2)+rotate()+ theme(axis.text.x = element_text(angle = 45, vjust = 1,hjust=1))


DE_E16_ciliated_genotype<-FindMarkers(E16_Dec7v3_epi,cells.1<-WhichCells(object=E16_Dec7v3_epi,cells.use = (E16_Dec7v3_epi@meta.data$genotype=="wt" & E16_Dec7v3_epi@meta.data$cell_type=="Ciliated" )),cells.2<-WhichCells(object=E16_Dec7v3_epi,cells.use = (E16_Dec7v3_epi@meta.data$genotype=="mut" & E16_Dec7v3_epi@meta.data$cell_type=="Ciliated" )),only.pos = F,logfc.threshold=0,min.pct=0.05)
| | 0 % ~calculating
|+ | 1 % ~05m 51s
|+ | 2 % ~05m 39s
|++ | 3 % ~05m 36s
|++ | 4 % ~05m 29s
|+++ | 5 % ~05m 29s
|+++ | 6 % ~05m 23s
|++++ | 7 % ~05m 20s
|++++ | 8 % ~05m 15s
|+++++ | 9 % ~05m 14s
|+++++ | 10% ~05m 09s
|++++++ | 11% ~05m 05s
|++++++ | 12% ~05m 04s
|+++++++ | 13% ~05m 02s
|+++++++ | 14% ~04m 57s
|++++++++ | 15% ~04m 54s
|++++++++ | 16% ~04m 50s
|+++++++++ | 17% ~04m 47s
|+++++++++ | 18% ~04m 42s
|++++++++++ | 19% ~04m 39s
|++++++++++ | 20% ~04m 35s
|+++++++++++ | 21% ~04m 32s
|+++++++++++ | 22% ~04m 28s
|++++++++++++ | 23% ~04m 25s
|++++++++++++ | 24% ~04m 21s
|+++++++++++++ | 25% ~04m 18s
|+++++++++++++ | 26% ~04m 14s
|++++++++++++++ | 27% ~04m 11s
|++++++++++++++ | 28% ~04m 08s
|+++++++++++++++ | 29% ~04m 05s
|+++++++++++++++ | 30% ~04m 01s
|++++++++++++++++ | 31% ~03m 58s
|++++++++++++++++ | 32% ~03m 55s
|+++++++++++++++++ | 33% ~03m 51s
|+++++++++++++++++ | 34% ~03m 47s
|++++++++++++++++++ | 35% ~03m 44s
|++++++++++++++++++ | 36% ~03m 40s
|+++++++++++++++++++ | 37% ~03m 37s
|+++++++++++++++++++ | 38% ~03m 34s
|++++++++++++++++++++ | 39% ~03m 30s
|++++++++++++++++++++ | 40% ~03m 27s
|+++++++++++++++++++++ | 41% ~03m 24s
|+++++++++++++++++++++ | 42% ~03m 20s
|++++++++++++++++++++++ | 43% ~03m 18s
|++++++++++++++++++++++ | 44% ~03m 14s
|+++++++++++++++++++++++ | 45% ~03m 10s
|+++++++++++++++++++++++ | 46% ~03m 07s
|++++++++++++++++++++++++ | 47% ~03m 03s
|++++++++++++++++++++++++ | 48% ~02m 59s
|+++++++++++++++++++++++++ | 49% ~02m 56s
|+++++++++++++++++++++++++ | 50% ~02m 52s
|++++++++++++++++++++++++++ | 51% ~02m 49s
|++++++++++++++++++++++++++ | 52% ~02m 45s
|+++++++++++++++++++++++++++ | 53% ~02m 41s
|+++++++++++++++++++++++++++ | 54% ~02m 38s
|++++++++++++++++++++++++++++ | 55% ~02m 35s
|++++++++++++++++++++++++++++ | 56% ~02m 31s
|+++++++++++++++++++++++++++++ | 57% ~02m 28s
|+++++++++++++++++++++++++++++ | 58% ~02m 24s
|++++++++++++++++++++++++++++++ | 59% ~02m 21s
|++++++++++++++++++++++++++++++ | 60% ~02m 17s
|+++++++++++++++++++++++++++++++ | 61% ~02m 14s
|+++++++++++++++++++++++++++++++ | 62% ~02m 10s
|++++++++++++++++++++++++++++++++ | 63% ~02m 07s
|++++++++++++++++++++++++++++++++ | 64% ~02m 03s
|+++++++++++++++++++++++++++++++++ | 65% ~01m 60s
|+++++++++++++++++++++++++++++++++ | 66% ~01m 56s
|++++++++++++++++++++++++++++++++++ | 67% ~01m 53s
|++++++++++++++++++++++++++++++++++ | 68% ~01m 49s
|+++++++++++++++++++++++++++++++++++ | 69% ~01m 46s
|+++++++++++++++++++++++++++++++++++ | 70% ~01m 42s
|++++++++++++++++++++++++++++++++++++ | 71% ~01m 39s
|++++++++++++++++++++++++++++++++++++ | 72% ~01m 35s
|+++++++++++++++++++++++++++++++++++++ | 73% ~01m 32s
|+++++++++++++++++++++++++++++++++++++ | 74% ~01m 29s
|++++++++++++++++++++++++++++++++++++++ | 75% ~01m 25s
|++++++++++++++++++++++++++++++++++++++ | 76% ~01m 22s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~01m 18s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~01m 15s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~01m 12s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~01m 08s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~01m 05s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~01m 01s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~58s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~54s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~51s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~48s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~44s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~41s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~37s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~34s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~31s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~27s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~24s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~20s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~17s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~14s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~10s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~07s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~03s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 05m 40s
DE_E16_ciliated_genotype
write.table(DE_E16_ciliated_genotype,"DE_E16_ciliated_genotype.txt",sep="\t")
DE_E16_ciliated_genotype$gene<-rownames(DE_E16_ciliated_genotype)
E16_ciliated_automatic_geneList<-DE_E16_ciliated_genotype$gene[DE_E16_ciliated_genotype$p_val_adj<0.001 & abs(DE_E16_ciliated_genotype$avg_logFC)>0.5 & abs(DE_E16_ciliated_genotype$pct.1-DE_E16_ciliated_genotype$pct.2)>0.15]
library(ggrepel)
#DE_P4_secretory_genotype$sig<-DE_P4_secretory_genotype$p_val_adj<0.001
DE_E16_ciliated_genotype$threshold<- ifelse(DE_E16_ciliated_genotype$avg_logFC>0 & DE_E16_ciliated_genotype$p_val_adj<0.001, "wt_enrich",ifelse(DE_E16_ciliated_genotype$avg_logFC<0 & DE_E16_ciliated_genotype$p_val_adj<0.001, "mut_enrich","NotSignificant" ) )
ggplot(DE_E16_ciliated_genotype, aes(avg_logFC, -log10(p_val_adj))) + #volcanoplot with avg_logFC versus p_val_adj
geom_point(aes(col=threshold),size=0.2) + #add points colored by significance
scale_color_manual(values=c("green", "black","magenta"))+
ggtitle("E16Ciliated_wt/mut") + geom_text_repel(data=DE_E16_ciliated_genotype[DE_E16_ciliated_genotype$gene %in% E16_ciliated_automatic_geneList,], aes(label=gene), point.padding = 1, box.padding = .3) +
labs(y = expression(-log[10]*" "*"adjusted pvalue"), x = "avg log fold change") +
theme(legend.title = element_blank(), legend.position = "top")

PCD genes are not significantly differentially expressed between genotypes:
#DE_P4_secretory_genotype$sig<-DE_P4_secretory_genotype$p_val_adj<0.001
DE_E16_ciliated_genotype$threshold<- ifelse(DE_E16_ciliated_genotype$avg_logFC>0 & DE_E16_ciliated_genotype$p_val_adj<0.001, "wt_enrich",ifelse(DE_E16_ciliated_genotype$avg_logFC<0 & DE_E16_ciliated_genotype$p_val_adj<0.001, "mut_enrich","NotSignificant" ) )
ggplot(DE_E16_ciliated_genotype, aes(avg_logFC, -log10(p_val_adj))) + #volcanoplot with avg_logFC versus p_val_adj
geom_point(aes(col=threshold),size=0.2) + #add points colored by significance
scale_color_manual(values=c("green", "black","magenta"))+
ggtitle("E16Ciliated_wt/mut") + geom_text_repel(data=DE_E16_ciliated_genotype[DE_E16_ciliated_genotype$gene %in% geneList$Primary.ciliary.dyskinesia,], aes(label=gene), point.padding = 1, box.padding = .3) +
labs(y = expression(-log[10]*" "*"adjusted pvalue"), x = "avg log fold change") +
theme(legend.title = element_blank(), legend.position = "top")

df_E16_epi<-FetchData(E16_Dec7v3_epi,c("Spdef","Creb3l1","Scgb3a2","Scgb1a1","Krt4","Krt13","Foxa3","Aqp3","Aqp4","Aqp5","Gp2","Sostdc1","Smoc2","Krt14","Krt15","Krt5","Rac2","Clic3","res.1.2","res.1.4","genotype","seq_group","specific_type","cell_type","Defb1","Lyz2","Ltf","Sftpa1","Sftpd","Sftpb","Slpi","Lcn2","Pigr","Muc5b","Muc5ac","Chil4","Muc1","Muc2","Muc4","Muc16","Muc20","Lbp","Cd14","Tlr4","Tlr2","Myd88","Ticam1","Itln1","Lgals3","Reg3g","Nod1","Nod2","Ddx58","Ifih1","Dhx58","Ccl5","Cxcl10","Cxcl2","Cxcl1","Pf4","Cxcl12","Cxcl14","Cxcl15","Cxcl16","Cxcl17","Ccl2","Ccl7","Ccl17","Ccl20","Ccl21a","Ccl25","Ccl27a","Ccl28","Cx3cl1","Il10","Tnf","S100a8","S100a9","Il6","Il18","Il1b","Il1rl1","Ccl11","Ccl24","Il33","Il25","Tslp","F2rl1","Retnla","Alox15","Alox5","Gata2","Tgfb2","Tgfb1","Ormdl3","Ptges","Ptgds","Ptgs2","Hpgds","Tbxas1","Areg"))
Error in FetchData(E16_Dec7v3_epi, c("Spdef", "Creb3l1", "Scgb3a2", "Scgb1a1", :
Error: Chil4 not found
MicrobialSensing:
for (i in c("Lbp","Cd14","Tlr4","Tlr2","Myd88","Ticam1","Itln1","Reg3g","Lgals3","Nod1","Nod2","Ddx58","Ifih1","Dhx58"))
{
pdf(file = paste("Manuscript/MicrobialSensing_genotype/E16/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_E16_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1),
geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}
antimicrobial effectors:
for (i in c("Muc1","Muc4","Muc16","Muc20","Muc5b","Muc5ac","Muc2","Defb1","Lyz2","Ltf","Sftpa1","Sftpd","Sftpb","Slpi","Lcn2","Pigr","Chil4"))
{
pdf(file = paste("Manuscript/Effectors_genotype/E16/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_E16_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1),
geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}
Error in FUN(X[[i]], ...) : object 'Chil4' not found
chemokines:
for (i in c("Ccl5","Cxcl10","Cxcl2","Cxcl1","Pf4","Cxcl12","Cxcl14","Cxcl15","Cxcl16","Cxcl17","Ccl2","Ccl7","Ccl17","Ccl20","Ccl21a","Ccl25","Ccl27a","Ccl28","Cx3cl1"))
{
pdf(file = paste("Manuscript/chemokines_genotype/E16/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_E16_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1),
geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}
Th2:
for (i in c("Il10","Tnf","S100a8","S100a9","Il6","Il18","Il1b","Il1rl1","Ccl11","Ccl24","Il33","Il25","Tslp","F2rl1","Retnla","Alox15","Alox5","Gata2","Tgfb2","Tgfb1","Ormdl3","Ptges","Ptgds","Ptgs2","Hpgds","Tbxas1","Areg"))
{
pdf(file = paste("Manuscript/Th2_genotype/E16/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_E16_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1),
geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}







explore genes correlated with basal–>secretory changes:
c3 is the basal/secretory population
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.4")
E16_Dec7v3_epi_subc3<-SubsetData(object=E16_Dec7v3_epi,ident.use=c(3))
table(E16_Dec7v3_epi_subc3@meta.data$res.1.4)
E16_Dec7v3_epi_subc3@meta.data<-E16_Dec7v3_epi_subc3@meta.data[,-which(names(E16_Dec7v3_epi_subc3@meta.data) %in% c("res.0.8", "res.1.2", "res.1.4", "res.1.6"))] #remove old metadata
E16_Dec7v3_epi_subc3 <- ScaleData(object = E16_Dec7v3_epi_subc3)
E16_Dec7v3_epi_subc3 <- FindVariableGenes(object = E16_Dec7v3_epi_subc3, do.plot = TRUE, x.low.cutoff=0.1,x.high.cutoff = Inf, y.cutoff = 0.5)
E16_Dec7v3_epi_subc3 <- RunPCA(object = E16_Dec7v3_epi_subc3, do.print = FALSE)
PCAPlot(E16_Dec7v3_epi_subc3)

PCElbowPlot(object = E16_Dec7v3_epi_subc3)
n.pcs.sub3 = 13
resolution parameter sets the ‘granularity’ of the downstream clustering, with increased values leading to a greater number of clusters.
res.used <- 1.2
E16_Dec7v3_epi_subc3 <- FindClusters(object = E16_Dec7v3_epi_subc3, reduction.type = "pca", dims.use = 1:n.pcs.sub3,
resolution = res.used, print.output = 0, force.recalc = T)
E16_Dec7v3_epi_subc3 <- RunTSNE(object = E16_Dec7v3_epi_subc3, dims.use = 1:n.pcs.sub3, perplexity=30)
TSNEPlot(object = E16_Dec7v3_epi_subc3, do.label = T)
res.used <- 0.8
TSNEPlot(object = E16_Dec7v3_epi_subc3, do.label = T)
res.used <- 0.6
TSNEPlot(object = E16_Dec7v3_epi_subc3, do.label = T)
E16_Dec7v3_epi_subc3 <- SetAllIdent(object = E16_Dec7v3_epi_subc3, id = "res.0.6")
DoHeatmap(object = E16_Dec7v3_epi_subc3, genes.use = c("Epcam","Krt8","Trp63","Krt5","Mki67","Top2a","Smoc2","Ccl20","Sostdc1","Bmp7","Clic3","Cldn10","Tspan33","Ehf","Sfta2","Crip2","Msln","Cyp2s1","Cldn3","Cldn7","Cldn4","AU021092","Tspan1","Chad","Tspan13","Klk10","Klk11","Klk13","Ces1d","Krt4","Krt13","Creb3l1"),
slim.col.label = TRUE, group.label.rot = TRUE,use.scaled = T
)
cor(E16_Dec7v3_epi_subc3@scale.data["Trp63",], E16_Dec7v3_epi_subc3@scale.data["Creb3l1",])
cor(E16_Dec7v3_epi_subc3@data["Trp63",], E16_Dec7v3_epi_subc3@data["Spdef",])
Trp63_cor<-apply(E16_Dec7v3_epi_subc3@scale.data, 1, function(x) cor(E16_Dec7v3_epi_subc3@scale.data["Trp63",],x))
head(Trp63_cor)
min(Trp63_cor,na.rm = T)
Trp63_cor_order<-order(Trp63_cor,decreasing=T)
head(Trp63_cor[Trp63_cor_order],20)
sum(is.na(Trp63_cor[Trp63_cor_order]))
Trp63_cor[Trp63_cor_order][15706:15686]
tail(Trp63_cor[Trp63_cor_order],20)
cor.test(E16_Dec7v3_epi_subc3@scale.data["Spdef",], E16_Dec7v3_epi_subc3@scale.data["Trp63",],method="pearson")
cor.test(E16_Dec7v3_epi_subc3@scale.data["Spdef",], E16_Dec7v3_epi_subc3@scale.data["Trp63",],method="kendall")
Trp63_cor_test<-apply(E16_Dec7v3_epi_subc3@scale.data, 1, function(x) cor.test(E16_Dec7v3_epi_subc3@scale.data["Trp63",],x,method="pearson"))
df_Trp63_corTest<-as.data.frame(do.call(rbind, Trp63_cor_test))
df_order_Trp63_corTest<-df_Trp63_corTest[order(unlist(df_Trp63_corTest$estimate)),]
tidy_Trp63_cor<-cbind(df_order_Trp63_corTest$estimate,df_order_Trp63_corTest$p.value)
colnames(tidy_Trp63_cor)<-c("cor","p.value")
head(tidy_Trp63_cor,20)
tidy_Trp63_cor[15706:15686,]
tail(tidy_Trp63_cor)
Krt8_cor_test<-apply(E16_Dec7v3_epi_subc3@scale.data, 1, function(x) cor.test(E16_Dec7v3_epi_subc3@scale.data["Krt8",],x,method="pearson"))
df_Krt8_corTest<-as.data.frame(do.call(rbind, Krt8_cor_test))
df_order_Krt8_corTest<-df_Krt8_corTest[order(unlist(df_Krt8_corTest$estimate)),]
sum(is.na(df_order_Krt8_corTest$estimate))
tidy_Krt8_cor<-cbind(df_order_Krt8_corTest$estimate,df_order_Krt8_corTest$p.value)
colnames(tidy_Krt8_cor)<-c("cor","p.value")
head(tidy_Krt8_cor,20)
tidy_Krt8_cor[15666:15706,]
cor.test(E16_Dec7v3_epi_subc3@scale.data["Krt8",E16_Dec7v3_epi_subc3@meta.data$genotype=="wt"], E16_Dec7v3_epi_subc3@scale.data["Numb",E16_Dec7v3_epi_subc3@meta.data$genotype=="wt"],method="pearson")
cor.test(E16_Dec7v3_epi_subc3@scale.data["Krt8",E16_Dec7v3_epi_subc3@meta.data$genotype=="mut"], E16_Dec7v3_epi_subc3@scale.data["Numb",E16_Dec7v3_epi_subc3@meta.data$genotype=="mut"],method="pearson")
LS0tCnRpdGxlOiAiRTE2X0RlY19zdWJzZXQiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQojbG9hZCgiRTE2X0RlYzd2M19UcmFjaGVhLlJEYXRhIikKYGBgCgojIyMjIyBiYXNhbCwgc2VjcmV0b3J5LCBhbmQgY2lsaWF0ZWQ6CmBgYHtyfQpFMTZfRGVjN3YzX1RyYWNoZWEgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19UcmFjaGVhLCBpZCA9ICJyZXMuMS4yIikKRTE2X0RlYzd2M19lcGk8LVN1YnNldERhdGEob2JqZWN0PUUxNl9EZWM3djNfVHJhY2hlYSxpZGVudC51c2U9YygxLDIwLDE3LDEzLDE5LDYsOSw0LDcpKQp0YWJsZShFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuMikKYGBgCmBgYHtyfQpjb2xuYW1lcyhFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEpW2NvbG5hbWVzKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSkgPT0gJ3Jlcy4wLjgnXSA8LSAnb3JpZy4wLjgnCmNvbG5hbWVzKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSlbY29sbmFtZXMoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhKSA9PSAncmVzLjEuMiddIDwtICdvcmlnLjEuMicKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBTY2FsZURhdGEob2JqZWN0ID0gRTE2X0RlYzd2M19lcGkpCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGkgPC0gRmluZFZhcmlhYmxlR2VuZXMob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGRvLnBsb3QgPSBUUlVFLCB4Lmxvdy5jdXRvZmY9MC4xLHguaGlnaC5jdXRvZmYgPSBJbmYsIHkuY3V0b2ZmID0gMC41KQpgYGAKIyMjIyMjcnVuIFBDQSBvbiB0aGUgc2V0IG9mIGdlbmVzCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBSdW5QQ0Eob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGRvLnByaW50ID0gRkFMU0UpCiNQQ0FQbG90KEUxNl9EZWM3djNfZXBpKQpgYGAKCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBQcm9qZWN0UENBKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBkby5wcmludCA9IEYpCmBgYAoKYGBge3J9ClBDRWxib3dQbG90KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpKQpgYGAKYGBge3IsZmlnLmhlaWdodD01MCxmaWcud2lkdGg9MTV9ClBDSGVhdG1hcChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgcGMudXNlID0gMToyMCwgY2VsbHMudXNlID0gNTAwLCBkby5iYWxhbmNlZCA9IFRSVUUsIGxhYmVsLmNvbHVtbnMgPSBGQUxTRSwgbnVtLmdlbmVzID0gMjUpCgpgYGAKCgpgYGB7cn0Kbi5wY3Muc3ViID0gMTcKYGBgCgpgYGB7cn0KcmVzLnVzZWQgPC0gMS4yCmBgYAoKYGBge3J9CkUxNl9EZWM3djNfZXBpIDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgcmVkdWN0aW9uLnR5cGUgPSAicGNhIiwgZGltcy51c2UgPSAxOm4ucGNzLnN1YiwgCiAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gPSByZXMudXNlZCwgcHJpbnQub3V0cHV0ID0gMCwgZm9yY2UucmVjYWxjID0gVCkKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBSdW5UU05FKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBkaW1zLnVzZSA9IDE6bi5wY3Muc3ViLCBwZXJwbGV4aXR5PTMwKQpgYGAKYGBge3IsIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTl9ClRTTkVQbG90KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBkby5sYWJlbCA9IFQscHQuc2l6ZSA9IDAuNCkKYGBgCgojIyMjIyBnZXQgdFNORSBlbWJlZGRpbmcgZm9yIHZlbG9jeXRvOgpgYGB7cn0KRTE2X0RlY19jdjNfSUQ8LXJlYWQuY3N2KGZpbGU9IkUxNl9EZWNfY3YzX0lELmNzdiIsaGVhZGVyPUYsc2VwPSIsIixzdHJpbmdzQXNGYWN0b3JzID0gRikgCgpgYGAKYGBge3J9CmhlYWQoRTE2X0RlY19jdjNfSUQpCgpgYGAKCmBgYHtyfQpFMTZfRGVjX2N2M19uYW1lPC1nc3ViKCJ4IiwiIixFMTZfRGVjX2N2M19JRCkKaGVhZChFMTZfRGVjX2N2M19uYW1lKQpgYGAKYGBge3J9CkUxNl9EZWNfY3YzX25hbWU8LWdzdWIoIjoiLCJfIixFMTZfRGVjX2N2M19uYW1lKQpoZWFkKEUxNl9EZWNfY3YzX25hbWUpCmBgYApgYGB7cn0KVFNORTFfTG9vbW9yZGVyX2VwaTwtRTE2X0RlYzd2M19lcGlAZHIkdHNuZUBjZWxsLmVtYmVkZGluZ3NbbWF0Y2goRTE2X0RlY19jdjNfbmFtZSxyb3duYW1lcyhFMTZfRGVjN3YzX2VwaUBkciR0c25lQGNlbGwuZW1iZWRkaW5ncykpLDFdCndyaXRlKFRTTkUxX0xvb21vcmRlcl9lcGksIlRTTkUxX0xvb21vcmRlcl9lcGkuY3N2IixuY29sdW1ucz0xLHNlcD0iLCIpCmBgYApgYGB7cn0KaGVhZChUU05FMV9Mb29tb3JkZXJfZXBpKQpgYGAKYGBge3J9ClRTTkUyX0xvb21vcmRlcl9lcGk8LUUxNl9EZWM3djNfZXBpQGRyJHRzbmVAY2VsbC5lbWJlZGRpbmdzW21hdGNoKEUxNl9EZWNfY3YzX25hbWUscm93bmFtZXMoRTE2X0RlYzd2M19lcGlAZHIkdHNuZUBjZWxsLmVtYmVkZGluZ3MpKSwyXQp3cml0ZShUU05FMl9Mb29tb3JkZXJfZXBpLCJUU05FMl9Mb29tb3JkZXJfZXBpLmNzdiIsbmNvbHVtbnM9MSxzZXA9IiwiKQoKYGBgCiMjIyMjIG1hcmtlcnMgZm9yIGVhY2ggY2lsaWF0ZWQgcG9wdWxhdGlvbjoKYGBge3J9CkUxNl9EZWNfZXBpX3JlczEyXzhvdmVyMTAxMTwtRmluZE1hcmtlcnMoRTE2X0RlYzd2M19lcGksaWRlbnQuMT1jKDgpLGlkZW50LjIgPSBjKDEwLDExKSxvbmx5LnBvcyA9IFRSVUUpCkUxNl9EZWNfZXBpX3JlczEyXzhvdmVyMTAxMQpgYGAKYGBge3J9CndyaXRlLnRhYmxlKEUxNl9EZWNfZXBpX3JlczEyXzhvdmVyMTAxMSwiZXBpU3Vic2V0X2M4aW5DaWxpYS50eHQiLHNlcD0iXHQiKQoKYGBgCgoKYGBge3J9CkUxNl9EZWNfZXBpX3JlczEyXzEwb3ZlcjgxMTwtRmluZE1hcmtlcnMoRTE2X0RlYzd2M19lcGksaWRlbnQuMT1jKDEwKSxpZGVudC4yID0gYyg4LDExKSxvbmx5LnBvcyA9IFRSVUUpCkUxNl9EZWNfZXBpX3JlczEyXzEwb3ZlcjgxMQpgYGAKYGBge3J9CkUxNl9EZWNfZXBpX3JlczEyXzEwb3Zlcjg8LUZpbmRNYXJrZXJzKEUxNl9EZWM3djNfZXBpLGlkZW50LjE9YygxMCksaWRlbnQuMiA9IGMoOCksb25seS5wb3MgPSBUUlVFKQpFMTZfRGVjX2VwaV9yZXMxMl8xMG92ZXI4CmBgYApgYGB7cn0Kd3JpdGUudGFibGUoRTE2X0RlY19lcGlfcmVzMTJfMTBvdmVyOCwiZXBpU3Vic2V0X2MxMG92ZXJDOC50eHQiLHNlcD0iXHQiKQoKYGBgCgpgYGB7cn0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjIiKQoKRTE2X0RlY19lcGlfcmVzMTJfMTBvdmVyMTE8LUZpbmRNYXJrZXJzKEUxNl9EZWM3djNfZXBpLGlkZW50LjE9YygxMCksaWRlbnQuMiA9IGMoMTEpLG9ubHkucG9zID0gVFJVRSkKRTE2X0RlY19lcGlfcmVzMTJfMTBvdmVyMTEKYGBgCmBgYHtyfQp3cml0ZS50YWJsZShFMTZfRGVjX2VwaV9yZXMxMl8xMG92ZXIxMSwiZXBpU3Vic2V0X2MxMG92ZXJDMTEudHh0IixzZXA9Ilx0IikKCmBgYAoKYGBge3J9CkUxNl9EZWNfZXBpX3JlczEyXzExb3ZlcjgxMDwtRmluZE1hcmtlcnMoRTE2X0RlYzd2M19lcGksaWRlbnQuMT1jKDExKSxpZGVudC4yID0gYyg4LDEwKSxvbmx5LnBvcyA9IFRSVUUpCkUxNl9EZWNfZXBpX3JlczEyXzExb3ZlcjgxMApgYGAKCmBgYHtyfQp3cml0ZS50YWJsZShFMTZfRGVjX2VwaV9yZXMxMl8xMW92ZXI4MTAsImVwaVN1YnNldF9jMTFpbkNpbGlhLnR4dCIsc2VwPSJcdCIpCgpgYGAKCgoKYGBge3IsZmlnLmhlaWdodD00LGZpZy53aWR0aD0xNn0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjIiKQoKRG9IZWF0bWFwKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBnZW5lcy51c2UgPSBjKCJGb3hqMSIsIlRvcDJhIiwiTWNpZGFzIiwiQ2NubyIsIkZveG40IiwiU2hpc2E4IiwiTHJyYzIzIiwiUHJyMTgiLCJDZmFwNTMiLCJDZGhyMyIsIlNudG4iLCJJZml0bTEiLCJMYnAiLCJMeTZjMSIsIkx5NmEiKSwgCiAgICBzbGltLmNvbC5sYWJlbCA9IFRSVUUsIGdyb3VwLmxhYmVsLnJvdCA9IFRSVUUsdXNlLnNjYWxlZCA9IEYsY2VsbHMudXNlID0gRTE2X0RlYzd2M19lcGlAY2VsbC5uYW1lc1tFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuMiAlaW4lIGMoOCwxMCwxMSldLGdyb3VwLm9yZGVyID0gYyg4LDEwLDExKSxncm91cC5jZXggPSAzMCxjZXgucm93ID0gMjAKICApCmBgYAoKCiMjIyMjIHNjb3Jpbmc6CmBgYHtyLGZpZy5oZWlnaHQ9NCxmaWcud2lkdGg9Mjh9CkUxNl9EZWM3djNfZXBpQGRhdGFbMTo2LDE6Nl0KCmBgYAoKYGBge3IsZmlnLmhlaWdodD00LGZpZy53aWR0aD0yOH0KcGVyY2VudGlsZV90YWJsZV9lcGk8LWFwcGx5KEUxNl9EZWM3djNfZXBpQGRhdGEsMSxwZXJjZW50X3JhbmspCgpgYGAKYGBge3IsZmlnLmhlaWdodD00LGZpZy53aWR0aD0yOH0KcGVyY2VudGlsZV90YWJsZV9lcGlbMTo2LDE6Nl0KCmBgYAoKCmBgYHtyfQpPTUlNZ2VuZTwtcmVhZC5jc3YoZmlsZSA9ICJnZW5lc09NSU0uY3N2IixoZWFkZXI9VCxzZXA9IiwiLHN0cmluZ3NBc0ZhY3RvcnMgPSBGKQpPTUlNZ2VuZTwtbGFwcGx5KE9NSU1nZW5lLGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdCh1bmxpc3QoeCksc3BsaXQ9IiwiKSkpIApoZWFkKE9NSU1nZW5lJE11Y29jaWxpYXJ5KQpgYGAKYGBge3J9Ck9NSU1nZW5lX211Y29zYUdvYmxldDwtYXMudmVjdG9yKHJlYWQuY3N2KGZpbGUgPSAiZ2VuZXNPTUlNX211Y29zYV9nb2JsZXQuY3N2IixoZWFkZXI9VCxzZXA9IiwiLHN0cmluZ3NBc0ZhY3RvcnMgPSBGKVssMV0pCk9NSU1nZW5lX211Y29zYUdvYmxldDwtdW5saXN0KHN0cnNwbGl0KHVubGlzdChPTUlNZ2VuZV9tdWNvc2FHb2JsZXQpLHNwbGl0PSIsIikpCk9NSU1nZW5lX211Y29zYUdvYmxldFs5MDoxMDVdCmBgYApgYGB7cn0KIG1vY29zYUdvYmxldF9zY29yZTwtIGFwcGx5KHBlcmNlbnRpbGVfdGFibGVfZXBpWyxjb2xuYW1lcyhwZXJjZW50aWxlX3RhYmxlX2VwaSkgJWluJSBPTUlNZ2VuZV9tdWNvc2FHb2JsZXRdLDEsbWVhbikKYGBgCmBgYHtyfQogaGVhZCggbW9jb3NhR29ibGV0X3Njb3JlKQpgYGAKYGBge3J9CkUxNl9EZWM3djNfZXBpPC1BZGRNZXRhRGF0YShvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgbWV0YWRhdGEgPSBtb2Nvc2FHb2JsZXRfc2NvcmUsIGNvbC5uYW1lID0gIm1vY29zYUdvYmxldF9zY29yZSIpCgpgYGAKYGBge3J9ClZsblBsb3Qob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGZlYXR1cmVzLnBsb3QgPSBjKCJtb2Nvc2FHb2JsZXRfc2NvcmUiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCgoKCgoKYGBge3J9CiBjaWxpb3BhdGh5X3RhYmxlPC0gcGVyY2VudGlsZV90YWJsZV9lcGlbLGNvbG5hbWVzKHBlcmNlbnRpbGVfdGFibGVfZXBpKSAlaW4lIE9NSU1nZW5lJENpbGlvcGF0aHldCmBgYAoKYGBge3J9CiBjaWxpb3BhdGh5X3Njb3JlPC0gYXBwbHkoY2lsaW9wYXRoeV90YWJsZSwxLG1lYW4pCmBgYApgYGB7cn0KIGhlYWQoY2lsaW9wYXRoeV9zY29yZSkKYGBgCmBgYHtyfQogUENEX3Njb3JlPC0gYXBwbHkocGVyY2VudGlsZV90YWJsZV9lcGlbLGNvbG5hbWVzKHBlcmNlbnRpbGVfdGFibGVfZXBpKSAlaW4lIE9NSU1nZW5lJFByaW1hcnkuY2lsaWFyeS5keXNraW5lc2lhXSwxLG1lYW4pCmBgYApgYGB7cn0KIGhlYWQoUENEX3Njb3JlKQpgYGAKCmBgYHtyfQpFMTZfRGVjN3YzX2VwaTwtQWRkTWV0YURhdGEob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIG1ldGFkYXRhID0gY2lsaW9wYXRoeV9zY29yZSwgY29sLm5hbWUgPSAiY2lsaW9wYXRoeV9zY29yZSIpCgpgYGAKYGBge3J9CkUxNl9EZWM3djNfZXBpPC1BZGRNZXRhRGF0YShvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgbWV0YWRhdGEgPSBQQ0Rfc2NvcmUsIGNvbC5uYW1lID0gIlBDRF9zY29yZSIpCgpgYGAKYGBge3J9ClZsblBsb3Qob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGZlYXR1cmVzLnBsb3QgPSBjKCJjaWxpb3BhdGh5X3Njb3JlIiksIG5Db2wgPSAxLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjMsdXNlLnJhdz1GLGdyb3VwLmJ5PSJyZXMuMS4yIikKCmBgYApgYGB7cn0KVmxuUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZmVhdHVyZXMucGxvdCA9IGMoIlBDRF9zY29yZSIpLCBuQ29sID0gMSx4LmxhYi5yb3QgPSBULHBvaW50LnNpemUudXNlID0gMC4zLHVzZS5yYXc9Rixncm91cC5ieT0icmVzLjEuMiIpCgpgYGAKYGBge3J9ClZsblBsb3Qob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGZlYXR1cmVzLnBsb3QgPSBjKCJQQ0Rfc2NvcmUiKSwgbkNvbCA9IDEsaWRlbnQuaW5jbHVkZSA9IGMoOCwxMCwxMSkseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjIiKQoKYGBgCgpgYGB7cn0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjIiKQoKVmxuUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZmVhdHVyZXMucGxvdCA9IGMoImNpbGlvcGF0aHlfc2NvcmUiKSwgaWRlbnQuaW5jbHVkZSA9IGMoMTEpLG5Db2wgPSAxLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjMsdXNlLnJhdz1GLGdyb3VwLmJ5PSJzZXFfZ3JvdXAiKQoKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBTZXRBbGxJZGVudChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgaWQgPSAicmVzLjEuMiIpCgpWbG5QbG90KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBmZWF0dXJlcy5wbG90ID0gYygiUENEX3Njb3JlIiksIGlkZW50LmluY2x1ZGUgPSBjKDgpLG5Db2wgPSAxLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjMsdXNlLnJhdz1GLGdyb3VwLmJ5PSJzZXFfZ3JvdXAiKQoKYGBgCmBgYHtyfQogbXVjdXNfc2NvcmU8LSBhcHBseShwZXJjZW50aWxlX3RhYmxlX2VwaVssY29sbmFtZXMocGVyY2VudGlsZV90YWJsZV9lcGkpICVpbiUgYyhPTUlNZ2VuZSRBaXJ3YXkuLi5NdWN1cyxPTUlNZ2VuZSRQdWxtb25hcnkuYW5kLk11Y3VzKV0sMSxtZWFuKQpgYGAKYGBge3J9CiBoZWFkKG11Y3VzX3Njb3JlKQpgYGAKYGBge3J9CkUxNl9EZWM3djNfZXBpPC1BZGRNZXRhRGF0YShvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgbWV0YWRhdGEgPSBtdWN1c19zY29yZSwgY29sLm5hbWUgPSAibXVjdXNfc2NvcmUiKQoKYGBgCgpgYGB7cn0KVmxuUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZmVhdHVyZXMucGxvdCA9IGMoIm11Y3VzX3Njb3JlIiksIG5Db2wgPSAxLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjMsdXNlLnJhdz1GLGdyb3VwLmJ5PSJyZXMuMS40IikKCmBgYApgYGB7cn0KIENPUERfc2NvcmU8LSBhcHBseShwZXJjZW50aWxlX3RhYmxlX2VwaVssY29sbmFtZXMocGVyY2VudGlsZV90YWJsZV9lcGkpICVpbiUgYyhPTUlNZ2VuZSRDT1BEKV0sMSxtZWFuKQpgYGAKYGBge3J9CiBoZWFkKENPUERfc2NvcmUpCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGk8LUFkZE1ldGFEYXRhKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBtZXRhZGF0YSA9IENPUERfc2NvcmUsIGNvbC5uYW1lID0gIkNPUERfc2NvcmUiKQoKYGBgCgpgYGB7cn0KVmxuUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZmVhdHVyZXMucGxvdCA9IGMoIkNPUERfc2NvcmUiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCgpgYGB7cn0KIGFzdGhtYV9zY29yZTwtIGFwcGx5KHBlcmNlbnRpbGVfdGFibGVfZXBpWyxjb2xuYW1lcyhwZXJjZW50aWxlX3RhYmxlX2VwaSkgJWluJSBjKE9NSU1nZW5lJFB1bG1vbmFyeS4uLkFzdGhtYSldLDEsbWVhbikKYGBgCmBgYHtyfQogaGVhZChhc3RobWFfc2NvcmUpCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGk8LUFkZE1ldGFEYXRhKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBtZXRhZGF0YSA9IGFzdGhtYV9zY29yZSwgY29sLm5hbWUgPSAiYXN0aG1hX3Njb3JlIikKCmBgYAoKYGBge3J9ClZsblBsb3Qob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGZlYXR1cmVzLnBsb3QgPSBjKCJhc3RobWFfc2NvcmUiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xNH0KZ2dwbG90KEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSxhZXMoZ2Vub3R5cGUsYXN0aG1hX3Njb3JlKSkrZmFjZXRfZ3JpZCgufnJlcy4xLjIpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoY29sb3I9Z2Vub3R5cGUsZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpKQpgYGAKCgoKCmBgYHtyfQpyZXMudXNlZCA8LSAxLjQKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBGaW5kQ2x1c3RlcnMob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIHJlZHVjdGlvbi50eXBlID0gInBjYSIsIGRpbXMudXNlID0gMTpuLnBjcy5zdWIsIAogICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uID0gcmVzLnVzZWQsIHByaW50Lm91dHB1dCA9IDAsIGZvcmNlLnJlY2FsYyA9IFQpCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGkgPC0gUnVuVFNORShvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZGltcy51c2UgPSAxOm4ucGNzLnN1YiwgcGVycGxleGl0eT0zMCkKYGBgCmBgYHtyLCBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD05fQpUU05FUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZG8ubGFiZWwgPSBULHB0LnNpemUgPSAwLjQpCmBgYAoKCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9MjJ9CkUxNl9EZWM3djNfZXBpPWJ1aWxkQ2x1c3RlclRyZWUoRTE2X0RlYzd2M19lcGksZG8ucmVvcmRlciA9IEYscmVvcmRlci5udW1lcmljID0gRixwY3MudXNlID0gMToxNykKCmBgYAoKCmBgYHtyfQp0YWJsZShFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuNCxFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkc2VxX2dyb3VwKQpgYGAKCmBgYHtyfQpwcm9wLnRhYmxlKHRhYmxlKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40LEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRzZXFfZ3JvdXApLDIpCmBgYAoKCmBgYHtyLGZpZy5oZWlnaHQ9OSxmaWcud2lkdGg9Mjh9CgpEb0hlYXRtYXAob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGdlbmVzLnVzZSA9IGMoIkVwY2FtIiwiVHJwNjMiLCJLcnQ1IiwiU29zdGRjMSIsIkNvbDZhMSIsIkNvbDZhMiIsIkNvbDZhMyIsIkJnbiIsIlBvc3RuIiwiVGsxIiwiTWtpNjciLCJUb3AyYSIsIkNyZWIzbDEiLCJNdWM1YWMiLCJHcDIiLCJSYWMyIiwiMTgxMDAxMEgyNFJpayIsIktydDE1IiwiS3J0NCIsIktydDEzIiwibXQtQ28zIiwibXQtQ3l0YiIsIkdhbG50NiIsIlB0Z2RyIiwiQjNnbnQ2IiwiQ2QxNzciLCJGb3huNCIsIkZveGoxIiwiQ2RocjMiLCJBbm8xIiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGdyb3VwLmJ5PSJyZXMuMS40IixjZXgucm93ID0gMjAKICApCmBgYApgYGB7cn0KVmxuUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZmVhdHVyZXMucGxvdCA9IGMoImRvdWJsZXRfc2NvcmUiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkY2VsbF90eXBlPC1tYXB2YWx1ZXMoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJHJlcy4xLjQsZnJvbT1jKCIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIiwiMTMiLCIxNCIsIjE1IiwiMTYiLCIxNyIsIjE4IiksdG89YygiQmFzYWwiLCJCYXNhbCIsIlNlY3JldG9yeSIsIkJhc2FsL1NlY3JldG9yeSIsIlNlY3JldG9yeSIsIlNlY3JldG9yeSIsIlNlY3JldG9yeSIsIkNpbGlhdGVkIiwiU2VjcmV0b3J5IiwiU2VjcmV0b3J5IiwiU2VjcmV0b3J5IiwiQ2lsaWF0ZWQiLCJTZWNyZXRvcnkiLCJCYXNhbCIsIkRvdWJsZXQiLCJDaWxpYXRlZCIsIlNlY3JldG9yeSIsIkRvdWJsZXQiLCJEb3VibGV0IikpCmBgYAoKCiMjIyMjIGMxNCwgMTcgYW5kIGMxOCBhcmUgZG91YmxldHMuCmBgYHtyLGZpZy53aWR0aD01LGZpZy5oZWlnaHQ9NX0KZ2dwbG90KGRhdGE9RTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhWyEoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDE0LDE3LDE4KSksXSxhZXMoc2VxX2dyb3VwLGZpbGw9Y2VsbF90eXBlKSkrIAogICAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKYGBgCgpgYGB7cixmaWcud2lkdGg9NSxmaWcuaGVpZ2h0PTV9CmdncGxvdChkYXRhPUUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YVshKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygxNCwxNywxOCkpLF0sYWVzKGdlbm90eXBlLGZpbGw9Y2VsbF90eXBlKSkrIAogICAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKYGBgCmBgYHtyLGZpZy53aWR0aD01LGZpZy5oZWlnaHQ9NX0KdGFibGUoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZVshKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygxNCwxNywxOCkpXSxFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkZ2Vub3R5cGVbIShFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuNCAlaW4lIGMoMTQsMTcsMTgpKV0pCmBgYApgYGB7cn0KREVfRTE2X3NlY3JldG9yeV9nZW5vdHlwZTwtRmluZE1hcmtlcnMoRTE2X0RlYzd2M19lcGksY2VsbHMuMTwtV2hpY2hDZWxscyhvYmplY3Q9RTE2X0RlYzd2M19lcGksY2VsbHMudXNlID0gKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZT09Ind0IiAmIEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRjZWxsX3R5cGU9PSJTZWNyZXRvcnkiICkpLGNlbGxzLjI8LVdoaWNoQ2VsbHMob2JqZWN0PUUxNl9EZWM3djNfZXBpLGNlbGxzLnVzZSA9IChFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkZ2Vub3R5cGU9PSJtdXQiICYgRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZT09IlNlY3JldG9yeSIgKSksb25seS5wb3MgPSBGLGxvZ2ZjLnRocmVzaG9sZD0wLG1pbi5wY3Q9MCkKREVfRTE2X3NlY3JldG9yeV9nZW5vdHlwZQpgYGAKYGBge3J9CmxpYnJhcnkoZ2dyZXBlbCkKYGBgCmBgYHtyfQpERV9FMTZfc2VjcmV0b3J5X2dlbm90eXBlJGdlbmU8LXJvd25hbWVzKERFX0UxNl9zZWNyZXRvcnlfZ2Vub3R5cGUpCkRFX0UxNl9zZWNyZXRvcnlfZ2Vub3R5cGUkc2lnPC1ERV9FMTZfc2VjcmV0b3J5X2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMQp2b2xjID0gZ2dwbG90KERFX0UxNl9zZWNyZXRvcnlfZ2Vub3R5cGUsIGFlcyhhdmdfbG9nRkMsIC1sb2cxMChwX3ZhbF9hZGopKSkgKyAjdm9sY2Fub3Bsb3Qgd2l0aCBhdmdfbG9nRkMgdmVyc3VzIHBfdmFsX2FkagogICAgZ2VvbV9wb2ludChhZXMoY29sPXNpZykpICsgI2FkZCBwb2ludHMgY29sb3JlZCBieSBzaWduaWZpY2FuY2UKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiYmxhY2siLCAicmVkIikpICsgCiAgICBnZ3RpdGxlKCJFMTZzZWNyZXRvcnlfd3QvbXV0IikgKyBnZW9tX3RleHRfcmVwZWwoZGF0YT1oZWFkKERFX0UxNl9zZWNyZXRvcnlfZ2Vub3R5cGUsIDQwKSwgYWVzKGxhYmVsPWdlbmUpLCBwb2ludC5wYWRkaW5nID0gMSwgYm94LnBhZGRpbmcgPSAuMykgKwogIGxhYnMoeSA9IGV4cHJlc3Npb24oLWxvZ1sxMF0qIiAiKiJhZGp1c3RlZCBwdmFsdWUiKSwgeCA9ICJhdmcgbG9nIGZvbGQgY2hhbmdlIikgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArIAogIHNjYWxlX2ZpbGxfZGlzY3JldGUobGFiZWxzID0gYygiTm90IFNpZyIsICJhZGp1c3RlZCBwdmFsIDwgMC4wMDEiKSkKYGBgCmBgYHtyfQp2b2xjCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJHNwZWNpZmljX3R5cGU8LW1hcHZhbHVlcyhFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuNCxmcm9tPWMoIjAiLCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiwiOCIsIjkiLCIxMCIsIjExIiwiMTIiLCIxMyIsIjE0IiwiMTUiLCIxNiIsIjE3IiwiMTgiKSx0bz1jKCJCYXNhbC1Tb3N0ZGMxIiwiQmFzYWwiLCJTZWNyZXRvcnktS3J0NCIsIkJhc2FsL1NlY3JldG9yeSIsIlNlY3JldG9yeS1LcnQ0IiwiU2VjcmV0b3J5IiwiU2VjcmV0b3J5LUtydDQiLCJDaWxpYXRlZCIsIlNlY3JldG9yeSIsIlNlY3JldG9yeS1LcnQ0IiwiU2VjcmV0b3J5LUtydDQiLCJDaWxpYXRlZCIsIkN5Y2xpbmdTZWNyZXRvcnkiLCJDeWNsaW5nQmFzYWwiLCJEb3VibGV0IiwiQ2lsaWF0ZWQiLCJTZWNyZXRvcnkiLCJEb3VibGV0IiwiRG91YmxldCIpKQpgYGAKCgpgYGB7cixmaWcud2lkdGg9NSxmaWcuaGVpZ2h0PTV9CnRhYmxlKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRzcGVjaWZpY190eXBlWyEoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDE0LDE3LDE4KSldLEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZVshKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygxNCwxNywxOCkpXSkKYGBgCgpgYGB7cixmaWcud2lkdGg9NSxmaWcuaGVpZ2h0PTV9CmdncGxvdChkYXRhPUUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YVshKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygxNCwxNywxOCkpLF0sYWVzKGdlbm90eXBlLGZpbGw9c3BlY2lmaWNfdHlwZSkpKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmBgYAojIyMjIyBtYXJrZXJzIGZvciBzcGVjaWZpYyBjbHVzdGVyczoKYGBge3IsZmlnLmhlaWdodD0zLGZpZy53aWR0aD04fQpFMTZfRGVjN3YzX2VwaTwtU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInNwZWNpZmljX3R5cGUiKQoKRTE2X0RlYzd2M19lcGlAaWRlbnQ9ZmFjdG9yKEUxNl9EZWM3djNfZXBpQGlkZW50LGxldmVscyhFMTZfRGVjN3YzX2VwaUBpZGVudClbYyg0LDgsOSwyLDEsMyw2LDUsNyldKQpEb3RQbG90KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBjb2xzLnVzZSA9IGMoImxpZ2h0Z3JleSIsInJlZCIpLGdlbmVzLnBsb3QgPSBjKCJGb3hqMSIsIlB0Z2RyIiwiQjNnbnQ2IiwiR2FsbnQ2IiwiQ2dyZWYxIiwiR3AyIiwiVGZmMiIsIk11YzViIiwiTXVjMTYiLCJDaXRlZDEiLCJLcnQ0IiwiQ3JlYjNsMSIsIlNwZGVmIiwiQ2xpYzMiLCJDY2wyMCIsIlNvc3RkYzEiLCJTbW9jMiIsIktydDE0IiwiQm1wNyIsIlRycDYzIiwiS3J0NSIsIk1raTY3IiwiVG9wMmEiKSxncm91cC5ieSA9ICJpZGVudCIsIHgubGFiLnJvdCA9IFQscGxvdC5sZWdlbmQgPSBUKQpgYGAKCmBgYHtyLGZpZy5oZWlnaHQ9MyxmaWcud2lkdGg9OH0KRTE2X0RlYzd2M19lcGk8LVNldEFsbElkZW50KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBpZCA9ICJzcGVjaWZpY190eXBlIikKCkUxNl9EZWM3djNfZXBpQGlkZW50PWZhY3RvcihFMTZfRGVjN3YzX2VwaUBpZGVudCxsZXZlbHMoRTE2X0RlYzd2M19lcGlAaWRlbnQpW2MoNCw4LDksMiwxLDMsNiw1LDcpXSkKRG90UGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgY29scy51c2UgPSBjKCJmb3Jlc3RncmVlbiIsIm1hZ2VudGEzIiksZ2VuZXMucGxvdCA9IGMoIkZveGoxIiwiUHRnZHIiLCJCM2dudDYiLCJHYWxudDYiLCJDZ3JlZjEiLCJHcDIiLCJUZmYyIiwiTXVjNWIiLCJNdWMxNiIsIkNpdGVkMSIsIktydDQiLCJDcmViM2wxIiwiU3BkZWYiLCJDbGljMyIsIkNjbDIwIiwiU29zdGRjMSIsIlNtb2MyIiwiS3J0MTQiLCJCbXA3IiwiVHJwNjMiLCJLcnQ1IiwiTWtpNjciLCJUb3AyYSIpLGdyb3VwLmJ5ID0gImlkZW50IiwgeC5sYWIucm90ID0gVCxwbG90LmxlZ2VuZCA9IFQsY29sLm1heCA9IDIsY29sLm1pbiA9IC0yKQpgYGAKCgpgYGB7cixmaWcuaGVpZ2h0PTMsZmlnLndpZHRoPTh9CnByaW50KGxldmVscyhFMTZfRGVjN3YzX2VwaUBpZGVudCkpCmBgYAoKCmBgYHtyLGZpZy5oZWlnaHQ9NixmaWcud2lkdGg9Mjh9CgpEb0hlYXRtYXAob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGdlbmVzLnVzZSA9IGMoIlRycDYzIiwiS3J0NSIsIktydDE0IiwiU29zdGRjMSIsIlRrMSIsIk1raTY3IiwiVG9wMmEiLCJTcGRlZiIsIkNyZWIzbDEiLCJNdWM1YiIsIk11YzVhYyIsIkdwMiIsIktydDE1IiwiS3J0NCIsIktydDEzIiwiRm94bjQiLCJNY2lkYXMiLCJGb3hqMSIsIkNkaHIzIiwiQW5vMSIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxncm91cC5ieT0icmVzLjEuNCIsY2VsbHMudXNlID0gRTE2X0RlYzd2M19lcGlAY2VsbC5uYW1lc1shKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygxNCwxNywxOCkpXQogICkKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9MTUsZmlnLndpZHRoPTQ1fQoKRG9IZWF0bWFwKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBnZW5lcy51c2UgPSBjKCJUcnA2MyIsIktydDUiLCJLcnQxNCIsIlNvc3RkYzEiLCJUazEiLCJNa2k2NyIsIlRvcDJhIiwiU2Z0cGIiLCJLcnQ0IiwiS3J0MTMiLCJDbGljMyIsIlNwZGVmIiwiQ3JlYjNsMSIsIk11YzViIiwiR3AyIiwiRm94ajEiLCJBbm8xIiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGdyb3VwLmJ5PSJzcGVjaWZpY190eXBlIixjZWxscy51c2UgPSBFMTZfRGVjN3YzX2VwaUBjZWxsLm5hbWVzWyEoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDE0LDE3LDE4KSldLGNleC5yb3cgPSAzMCxncm91cC5jZXggPSA1MCxncm91cC5vcmRlciA9IGMoIkJhc2FsLVNvc3RkYzEiLCJDeWNsaW5nQmFzYWwiLCJCYXNhbCIsIkJhc2FsL1NlY3JldG9yeSIsIkN5Y2xpbmdTZWNyZXRvcnkiLCJTZWNyZXRvcnktS3J0NCIsIlNlY3JldG9yeSIsIkNpbGlhdGVkIikKICApCmBgYAoKCmBgYHtyfQpzYXZlKEUxNl9EZWM3djNfZXBpLGZpbGU9IkUxNl9EZWM3djNfZXBpLlJEYXRhIikKYGBgCiMjIyMgZGlmZmVyZW50IHBvcHVsYXRpb25zIG9mIGJhc2FsIGNlbGxzOgpgYGB7cn0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjQiKQpFMTZfRGVjX2VwaV9yZXMxNF8wb3ZlcjE8LUZpbmRNYXJrZXJzKEUxNl9EZWM3djNfZXBpLGlkZW50LjE9YygwKSxpZGVudC4yID0gYygxKSxvbmx5LnBvcyA9IFRSVUUpCkUxNl9EZWNfZXBpX3JlczE0XzBvdmVyMQpgYGAKYGBge3J9CndyaXRlLnRhYmxlKEUxNl9EZWNfZXBpX3JlczE0XzBvdmVyMSwiZXBpU3Vic2V0X3JlczE0X2Mwb3ZlckMxLnR4dCIsc2VwPSJcdCIpCgpgYGAKYGBge3J9CmxpYnJhcnkoZ2dyZXBlbCkKYGBgCmBgYHtyfQpFMTZfRGVjX2VwaV9yZXMxNF8wb3ZlcjEkZ2VuZTwtcm93bmFtZXMoRTE2X0RlY19lcGlfcmVzMTRfMG92ZXIxKQpFMTZfRGVjX2VwaV9yZXMxNF8wb3ZlcjEkc2lnPC1FMTZfRGVjX2VwaV9yZXMxNF8wb3ZlcjEkcF92YWxfYWRqPDAuMDAxCnZvbGMgPSBnZ3Bsb3QoRTE2X0RlY19lcGlfcmVzMTRfMG92ZXIxLCBhZXMoYXZnX2xvZ0ZDLCAtbG9nMTAocF92YWxfYWRqKSkpICsgI3ZvbGNhbm9wbG90IHdpdGggYXZnX2xvZ0ZDIHZlcnN1cyBwX3ZhbF9hZGoKICAgIGdlb21fcG9pbnQoYWVzKGNvbD1zaWcpKSArICNhZGQgcG9pbnRzIGNvbG9yZWQgYnkgc2lnbmlmaWNhbmNlCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoImJsYWNrIiwgInJlZCIpKSArIAogICAgZ2d0aXRsZSgiRTE2X2VwaV8wb3ZlcjEiKSAKCkUxNl9EZWNfZXBpX3JlczE0XzBvdmVyMV92b2xjLjEgPC0gdm9sYyArIGdlb21fdGV4dF9yZXBlbChkYXRhPWhlYWQoRTE2X0RlY19lcGlfcmVzMTRfMG92ZXIxLCAyMCksIGFlcyhsYWJlbD1nZW5lKSwgcG9pbnQucGFkZGluZyA9IDEsIGJveC5wYWRkaW5nID0gLjMpICsKICBsYWJzKHkgPSBleHByZXNzaW9uKC1sb2dbMTBdKiIgIioiYWRqdXN0ZWQgcHZhbHVlIiksIHggPSAiYXZnIGxvZyBmb2xkIGNoYW5nZSIpICsgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKyAKICBzY2FsZV9maWxsX2Rpc2NyZXRlKGxhYmVscyA9IGMoIk5vdCBTaWciLCAiYWRqdXN0ZWQgcHZhbCA8IDAuMDAxIikpCmBgYApgYGB7cn0KRTE2X0RlY19lcGlfcmVzMTRfMG92ZXIxX3ZvbGMuMQpgYGAKCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBTZXRBbGxJZGVudChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgaWQgPSAicmVzLjEuNCIpCkUxNl9EZWNfZXBpX3JlczE0XzFvdmVyMDwtRmluZE1hcmtlcnMoRTE2X0RlYzd2M19lcGksaWRlbnQuMT1jKDEpLGlkZW50LjIgPSBjKDApLG9ubHkucG9zID0gVFJVRSkKRTE2X0RlY19lcGlfcmVzMTRfMW92ZXIwCmBgYApgYGB7cn0Kd3JpdGUudGFibGUoRTE2X0RlY19lcGlfcmVzMTRfMW92ZXIwLCJlcGlTdWJzZXRfcmVzMTRfYzFvdmVyQzAudHh0IixzZXA9Ilx0IikKCmBgYAoKYGBge3J9CkUxNl9EZWM3djNfZXBpIDwtIFNldEFsbElkZW50KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBpZCA9ICJyZXMuMS40IikKRTE2X0RlY19lcGlfcmVzMTRfOW92ZXIxPC1GaW5kTWFya2VycyhFMTZfRGVjN3YzX2VwaSxpZGVudC4xPWMoOSksaWRlbnQuMiA9IGMoMSksb25seS5wb3MgPSBUUlVFKQpFMTZfRGVjX2VwaV9yZXMxNF85b3ZlcjEKYGBgCmBgYHtyfQp3cml0ZS50YWJsZShFMTZfRGVjX2VwaV9yZXMxNF85b3ZlcjEsImVwaVN1YnNldF9yZXMxNF9jOW92ZXJDMS50eHQiLHNlcD0iXHQiKQoKYGBgCgpgYGB7cn0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjQiKQpFMTZfRGVjX2VwaV9yZXMxNF8xb3Zlcjk8LUZpbmRNYXJrZXJzKEUxNl9EZWM3djNfZXBpLGlkZW50LjE9YygxKSxpZGVudC4yID0gYyg5KSxvbmx5LnBvcyA9IFRSVUUpCkUxNl9EZWNfZXBpX3JlczE0XzFvdmVyOQpgYGAKYGBge3J9CndyaXRlLnRhYmxlKEUxNl9EZWNfZXBpX3JlczE0XzFvdmVyOSwiZXBpU3Vic2V0X3JlczE0X2Mxb3ZlckM5LnR4dCIsc2VwPSJcdCIpCgpgYGAKYGBge3IsZmlnLmhlaWdodD04LGZpZy53aWR0aD0zMH0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjQiKQpEb0hlYXRtYXAob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGdlbmVzLnVzZSA9IGMoIkVwY2FtIiwiS3J0OCIsIlRycDYzIiwiS3J0NSIsIk1raTY3IiwiVG9wMmEiLCJTbW9jMiIsIkNjbDIwIiwiU29zdGRjMSIsIkJtcDciLCJDbGljMyIsIkNsZG4xMCIsIlRzcGFuMzMiLCJFaGYiLCJTZnRhMiIsIkNyaXAyIiwiTXNsbiIsIkN5cDJzMSIsIkNsZG4zIiwiQ2xkbjciLCJDbGRuNCIsIkFVMDIxMDkyIiwiVHNwYW4xIiwiQ2hhZCIsIlRzcGFuMTMiLCJLbGsxMCIsIktsazExIiwiS2xrMTMiLCJDZXMxZCIsIktydDQiLCJLcnQxMyIsIkNyZWIzbDEiLCJTcGRlZiIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxjZWxscy51c2UgPSBFMTZfRGVjN3YzX2VwaUBjZWxsLm5hbWVzW0UxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygwLDEzLDEsMyw5KV0sZ3JvdXAub3JkZXIgPSBjKDAsMTMsMSwzLDkpLGNleC5yb3cgPSAyMCxncm91cC5jZXggPSAzMAogICkKYGBgCiMjIyMjIGRpZmZlcmVudCBwb3B1bGF0aW9ucyBvZiBjaWxpYXRlZCBjZWxsczoKYGBge3IsZmlnLmhlaWdodD01LGZpZy53aWR0aD0xNn0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjQiKQoKRG9IZWF0bWFwKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBnZW5lcy51c2UgPSBjKCJGb3hqMSIsIlNoaXNhOCIsIk1jaWRhcyIsIkNjbm8iLCJQbGs0IiwiSHlsczEiLCJGb3huNCIsIkxycmMyMyIsIlBycjE4IiwiQ2ZhcDUzIiwiQ2RocjMiLCJDZGhyNCIsIkxkbHJhZDEiLCJTbnRuIiwiSWZpdG0xIiwiTGJwIiwiTHk2YzEiLCJMeTZhIiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGNlbGxzLnVzZSA9IEUxNl9EZWM3djNfZXBpQGNlbGwubmFtZXNbRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDcsMTEsMTUpXSxncm91cC5vcmRlciA9IGMoNywxMSwxNSksZ3JvdXAuY2V4ID0gMzAsY2V4LnJvdyA9IDIwCiAgKQpgYGAKIyMjIyMgZGlmZmVyZW50IHBvcHVsYXRpb25zIG9mIHNlY3JldG9yeSBjZWxsczoKYGBge3IsZmlnLmhlaWdodD0xMCxmaWcud2lkdGg9MzB9CkUxNl9EZWM3djNfZXBpIDwtIFNldEFsbElkZW50KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBpZCA9ICJyZXMuMS40IikKRG9IZWF0bWFwKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBnZW5lcy51c2UgPSBjKCJFcGNhbSIsIk1raTY3IiwiVG9wMmEiLCJTZnRwYiIsIkhwIiwiS3J0NCIsIktydDEzIiwiTGdhbHMzIiwiQ2xpYzMiLCJTZWMxNGwzIiwiS3J0OCIsIktydDE4IiwiTXVjMTYiLCJDcmViM2wxIiwiU3BkZWYiLCJNdWM1YWMiLCJNdWM1YiIsIkZveGEzIiwiRmticDExIiwiR2FsbnQxMiIsIkx0ZiIsIkdwMiIsIlRmZjIiLCJHYWxudDYiLCJQdGdkciIsIkNkMTc3IiksCiAgICBzbGltLmNvbC5sYWJlbCA9IFRSVUUsIGdyb3VwLmxhYmVsLnJvdCA9IFRSVUUsdXNlLnNjYWxlZCA9IFQsY2VsbHMudXNlID0gRTE2X0RlYzd2M19lcGlAY2VsbC5uYW1lc1tFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuNCAlaW4lIGMoNiwyLDQsNSwxMiw4LDEwLDE2KV0sZ3JvdXAub3JkZXIgPSBjKDEyLDYsNCwyLDEwLDUsOCwxNiksY2V4LmNvbD0xLGNleC5yb3cgPSAyMCxncm91cC5jZXggPSAzMAogICkKYGBgCgoKCmBgYHtyfQplcGlfbWFya2VyX2MwX3d0X211dDwtRmluZE1hcmtlcnMoRTE2X0RlYzd2M19lcGksY2VsbHMuMTwtV2hpY2hDZWxscyhvYmplY3Q9RTE2X0RlYzd2M19lcGksaWRlbnQ9MCxjZWxscy51c2UgPSBFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkZ2Vub3R5cGU9PSJ3dCIpLGNlbGxzLjI8LVdoaWNoQ2VsbHMob2JqZWN0PUUxNl9EZWM3djNfZXBpLGlkZW50PTAsY2VsbHMudXNlID0gRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGdlbm90eXBlPT0ibXV0Iiksb25seS5wb3MgPSBUUlVFKQplcGlfbWFya2VyX2MwX3d0X211dApgYGAKIyMjIyMgU29zdGRjMSBzZWVtcyB0byBiZSBkb3ducmVndWxhdGVkIGluIG11dGFudCBiYXNhbC1Tb3N0ZGMxIHBvcHVsYXRpb24uCgpgYGB7cn0KZXBpX21hcmtlcl9jMF9tdXRfd3Q8LUZpbmRNYXJrZXJzKEUxNl9EZWM3djNfZXBpLGNlbGxzLjE8LVdoaWNoQ2VsbHMob2JqZWN0PUUxNl9EZWM3djNfZXBpLGlkZW50PTAsY2VsbHMudXNlID0gRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGdlbm90eXBlPT0ibXV0IiksY2VsbHMuMjwtV2hpY2hDZWxscyhvYmplY3Q9RTE2X0RlYzd2M19lcGksaWRlbnQ9MCxjZWxscy51c2UgPSBFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkZ2Vub3R5cGU9PSJ3dCIpLG9ubHkucG9zID0gVFJVRSkKZXBpX21hcmtlcl9jMF9tdXRfd3QKYGBgCgoKYGBge3J9CkUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSR0eXBlX2dlbm90eXBlPC1hcy5mYWN0b3IocGFzdGUoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZSxFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkZ2Vub3R5cGUsc2VwPSJfIikpCmBgYApgYGB7cixmaWcuaGVpZ2h0PTYsZmlnLndpZHRoPTZ9CkUxNl9EZWM3djNfZXBpPC1TZXRBbGxJZGVudChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgaWQgPSAidHlwZV9nZW5vdHlwZSIpCgpFMTZfRGVjN3YzX2VwaUBpZGVudD1mYWN0b3IoRTE2X0RlYzd2M19lcGlAaWRlbnQsbGV2ZWxzKEUxNl9EZWM3djNfZXBpQGlkZW50KVtjKDEsNCwyLDMsOSwxMCw1LDYsNyw4KV0pICAjanVzdCB0byByZW9yZGVyIHRoZSBncm91cHMKRG90UGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgY29scy51c2UgPSBjKCJ5ZWxsb3ciLCJyZWQiKSxnZW5lcy5wbG90ID0gcmV2KGMoIlNmdHBhMSIsIk11YzVhYyIsIk11YzIiLCJNdWMyMCIsIk11YzViIiwiTXVjMSIsIk11YzE2IiwiTXVjNCIsIlBpZ3IiLCJMdGYiLCJMeXoyIiwiU2xwaSIsIkxjbjIiLCJTZnRwZCIsIlNmdHBiIiwiRGVmYjEiKSkseC5sYWIucm90ID0gVCxwbG90LmxlZ2VuZCA9IFQsZ3JvdXAuYnkgPSAiaWRlbnQiLGRvLnJldHVybj1UKStyb3RhdGUoKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgdmp1c3QgPSAxLGhqdXN0PTEpKSAKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9NixmaWcud2lkdGg9Nn0KRTE2X0RlYzd2M19lcGk8LVNldEFsbElkZW50KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBpZCA9ICJ0eXBlX2dlbm90eXBlIikKCkUxNl9EZWM3djNfZXBpQGlkZW50PWZhY3RvcihFMTZfRGVjN3YzX2VwaUBpZGVudCxsZXZlbHMoRTE2X0RlYzd2M19lcGlAaWRlbnQpW2MoMSw0LDIsMyw5LDEwLDUsNiw3LDgpXSkKRG90UGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgY29scy51c2UgPSBjKCJmb3Jlc3RncmVlbiIsIm1hZ2VudGEzIiksZ2VuZXMucGxvdCA9IHJldihjKCJOZmtiaWEiLCJOZmtiaXoiLCJSZXRubGEiLCJDeGNsMTciLCJDeGNsMTUiLCJDY2wyMCIsIkFyZWciLCJNdWM1YiIsIk11YzQiLCJQaWdyIiwiTHRmIiwiTHl6MiIsIlNscGkiLCJMY24yIiwiU2Z0cGQiLCJTZnRwYiIsIkRlZmIxIiwiTGdhbHMzIiwiSXRsbjEiKSkseC5sYWIucm90ID0gVCxwbG90LmxlZ2VuZCA9IFQsZ3JvdXAuYnkgPSAiaWRlbnQiLGRvLnJldHVybj1ULGNvbC5taW4gPSAtMixjb2wubWF4ID0gMikrcm90YXRlKCkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMSxoanVzdD0xKSkgCmBgYApgYGB7cn0KREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlPC1GaW5kTWFya2VycyhFMTZfRGVjN3YzX2VwaSxjZWxscy4xPC1XaGljaENlbGxzKG9iamVjdD1FMTZfRGVjN3YzX2VwaSxjZWxscy51c2UgPSAoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGdlbm90eXBlPT0id3QiICYgRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZT09IkNpbGlhdGVkIiApKSxjZWxscy4yPC1XaGljaENlbGxzKG9iamVjdD1FMTZfRGVjN3YzX2VwaSxjZWxscy51c2UgPSAoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGdlbm90eXBlPT0ibXV0IiAmIEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRjZWxsX3R5cGU9PSJDaWxpYXRlZCIgKSksb25seS5wb3MgPSBGLGxvZ2ZjLnRocmVzaG9sZD0wLG1pbi5wY3Q9MC4wNSkKREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlCmBgYAoKYGBge3J9CndyaXRlLnRhYmxlKERFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSwiREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlLnR4dCIsc2VwPSJcdCIpCmBgYAoKCmBgYHtyfQpERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkZ2VuZTwtcm93bmFtZXMoREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlKQpFMTZfY2lsaWF0ZWRfYXV0b21hdGljX2dlbmVMaXN0PC1ERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkZ2VuZVtERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxICYgYWJzKERFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSRhdmdfbG9nRkMpPjAuNSAmIGFicyhERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkcGN0LjEtREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlJHBjdC4yKT4wLjE1XQpgYGAKYGBge3J9CmxpYnJhcnkoZ2dyZXBlbCkKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9MTJ9CgojREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJHNpZzwtREVfUDRfc2VjcmV0b3J5X2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMQpERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkdGhyZXNob2xkPC0gaWZlbHNlKERFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSRhdmdfbG9nRkM+MCAmIERFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEsICJ3dF9lbnJpY2giLGlmZWxzZShERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkYXZnX2xvZ0ZDPDAgJiBERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxLCAibXV0X2VucmljaCIsIk5vdFNpZ25pZmljYW50IiApICkKZ2dwbG90KERFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSwgYWVzKGF2Z19sb2dGQywgLWxvZzEwKHBfdmFsX2FkaikpKSArICN2b2xjYW5vcGxvdCB3aXRoIGF2Z19sb2dGQyB2ZXJzdXMgcF92YWxfYWRqCiAgICBnZW9tX3BvaW50KGFlcyhjb2w9dGhyZXNob2xkKSxzaXplPTAuMikgKyAjYWRkIHBvaW50cyBjb2xvcmVkIGJ5IHNpZ25pZmljYW5jZQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiZ3JlZW4iLCAiYmxhY2siLCJtYWdlbnRhIikpKwogICAgZ2d0aXRsZSgiRTE2Q2lsaWF0ZWRfd3QvbXV0IikgKyBnZW9tX3RleHRfcmVwZWwoZGF0YT1ERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGVbREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlJGdlbmUgJWluJSBFMTZfY2lsaWF0ZWRfYXV0b21hdGljX2dlbmVMaXN0LF0sIGFlcyhsYWJlbD1nZW5lKSwgcG9pbnQucGFkZGluZyA9IDEsIGJveC5wYWRkaW5nID0gLjMpICsKICBsYWJzKHkgPSBleHByZXNzaW9uKC1sb2dbMTBdKiIgIioiYWRqdXN0ZWQgcHZhbHVlIiksIHggPSAiYXZnIGxvZyBmb2xkIGNoYW5nZSIpICsgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb24gPSAidG9wIikgCmBgYAojIyMjIyBQQ0QgZ2VuZXMgYXJlIG5vdCBzaWduaWZpY2FudGx5IGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBiZXR3ZWVuIGdlbm90eXBlczoKYGBge3IsZmlnLmhlaWdodD04LGZpZy53aWR0aD0xMn0KCiNERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkc2lnPC1ERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxCkRFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSR0aHJlc2hvbGQ8LSBpZmVsc2UoREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlJGF2Z19sb2dGQz4wICYgREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMSwgInd0X2VucmljaCIsaWZlbHNlKERFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSRhdmdfbG9nRkM8MCAmIERFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEsICJtdXRfZW5yaWNoIiwiTm90U2lnbmlmaWNhbnQiICkgKQpnZ3Bsb3QoREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlLCBhZXMoYXZnX2xvZ0ZDLCAtbG9nMTAocF92YWxfYWRqKSkpICsgI3ZvbGNhbm9wbG90IHdpdGggYXZnX2xvZ0ZDIHZlcnN1cyBwX3ZhbF9hZGoKICAgIGdlb21fcG9pbnQoYWVzKGNvbD10aHJlc2hvbGQpLHNpemU9MC4yKSArICNhZGQgcG9pbnRzIGNvbG9yZWQgYnkgc2lnbmlmaWNhbmNlCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJncmVlbiIsICJibGFjayIsIm1hZ2VudGEiKSkrCiAgICBnZ3RpdGxlKCJFMTZDaWxpYXRlZF93dC9tdXQiKSArIGdlb21fdGV4dF9yZXBlbChkYXRhPURFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZVtERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkZ2VuZSAlaW4lIGdlbmVMaXN0JFByaW1hcnkuY2lsaWFyeS5keXNraW5lc2lhLF0sIGFlcyhsYWJlbD1nZW5lKSwgcG9pbnQucGFkZGluZyA9IDEsIGJveC5wYWRkaW5nID0gLjMpICsKICBsYWJzKHkgPSBleHByZXNzaW9uKC1sb2dbMTBdKiIgIioiYWRqdXN0ZWQgcHZhbHVlIiksIHggPSAiYXZnIGxvZyBmb2xkIGNoYW5nZSIpICsgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb24gPSAidG9wIikgCmBgYAoKYGBge3J9CgpERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGVbREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlJGdlbmUgJWluJSBnZW5lTGlzdCRQcmltYXJ5LmNpbGlhcnkuZHlza2luZXNpYSxdCmBgYApgYGB7cn0KCkRFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZVtERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkZ2VuZSAlaW4lIGdlbmVMaXN0JENpbGlvcGF0aHksXQpgYGAKCgpgYGB7cn0KZGZfRTE2X2VwaTwtRmV0Y2hEYXRhKEUxNl9EZWM3djNfZXBpLGMoIlNwZGVmIiwiQ3JlYjNsMSIsIlNjZ2IzYTIiLCJTY2diMWExIiwiS3J0NCIsIktydDEzIiwiRm94YTMiLCJBcXAzIiwiQXFwNCIsIkFxcDUiLCJHcDIiLCJTb3N0ZGMxIiwiU21vYzIiLCJLcnQxNCIsIktydDE1IiwiS3J0NSIsIlJhYzIiLCJDbGljMyIsInJlcy4xLjIiLCJyZXMuMS40IiwiZ2Vub3R5cGUiLCJzZXFfZ3JvdXAiLCJzcGVjaWZpY190eXBlIiwiY2VsbF90eXBlIiwiRGVmYjEiLCJMeXoyIiwiTHRmIiwiU2Z0cGExIiwiU2Z0cGQiLCJTZnRwYiIsIlNscGkiLCJMY24yIiwiUGlnciIsIk11YzViIiwiTXVjNWFjIiwiTXVjMSIsIk11YzIiLCJNdWM0IiwiTXVjMTYiLCJNdWMyMCIsIkxicCIsIkNkMTQiLCJUbHI0IiwiVGxyMiIsIk15ZDg4IiwiVGljYW0xIiwiSXRsbjEiLCJMZ2FsczMiLCJSZWczZyIsIk5vZDEiLCJOb2QyIiwiRGR4NTgiLCJJZmloMSIsIkRoeDU4IiwiQ2NsNSIsIkN4Y2wxMCIsIkN4Y2wyIiwiQ3hjbDEiLCJQZjQiLCJDeGNsMTIiLCJDeGNsMTQiLCJDeGNsMTUiLCJDeGNsMTYiLCJDeGNsMTciLCJDY2wyIiwiQ2NsNyIsIkNjbDE3IiwiQ2NsMjAiLCJDY2wyMWEiLCJDY2wyNSIsIkNjbDI3YSIsIkNjbDI4IiwiQ3gzY2wxIiwiSWwxMCIsIlRuZiIsIlMxMDBhOCIsIlMxMDBhOSIsIklsNiIsIklsMTgiLCJJbDFiIiwiSWwxcmwxIiwiQ2NsMTEiLCJDY2wyNCIsIklsMzMiLCJJbDI1IiwiVHNscCIsIkYycmwxIiwiUmV0bmxhIiwiQWxveDE1IiwiQWxveDUiLCJHYXRhMiIsIlRnZmIyIiwiVGdmYjEiLCJPcm1kbDMiLCJQdGdlcyIsIlB0Z2RzIiwiUHRnczIiLCJIcGdkcyIsIlRieGFzMSIsIkFyZWciLCJJZm5rIiwiSWZubHIxIiwiTmZrYml6IiwiTmZrYmlhIikpCgpgYGAKIyMjIyMgTWljcm9iaWFsU2Vuc2luZzoKYGBge3IsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTd9CmZvciAoaSBpbiBjKCJMYnAiLCJDZDE0IiwiVGxyNCIsIlRscjIiLCJNeWQ4OCIsIlRpY2FtMSIsIkl0bG4xIiwiUmVnM2ciLCJMZ2FsczMiLCJOb2QxIiwiTm9kMiIsIkRkeDU4IiwiSWZpaDEiLCJEaHg1OCIpKQp7CnBkZihmaWxlID0gcGFzdGUoIk1hbnVzY3JpcHQvTWljcm9iaWFsU2Vuc2luZ19nZW5vdHlwZS9FMTYvIixpLCIucGRmIiwgc2VwID0gIiIpLCB3aWR0aCA9IDYsIGhlaWdodCA9IDUpCnByaW50KGdncGxvdChkZl9FMTZfZXBpLGFlc19zdHJpbmcoeD0iZ2Vub3R5cGUiLHk9aSkpK2ZhY2V0X2dyaWQoLn5jZWxsX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkpCmRldi5vZmYoKQp9CmBgYAoKIyMjIyMgYW50aW1pY3JvYmlhbCBlZmZlY3RvcnM6CmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD03fQpmb3IgKGkgaW4gYygiTXVjMSIsIk11YzQiLCJNdWMxNiIsIk11YzIwIiwiTXVjNWIiLCJNdWM1YWMiLCJNdWMyIiwiRGVmYjEiLCJMeXoyIiwiTHRmIiwiU2Z0cGExIiwiU2Z0cGQiLCJTZnRwYiIsIlNscGkiLCJMY24yIiwiUGlnciIsIkNoaWw0IikpCnsKcGRmKGZpbGUgPSBwYXN0ZSgiTWFudXNjcmlwdC9FZmZlY3RvcnNfZ2Vub3R5cGUvRTE2LyIsaSwiLnBkZiIsIHNlcCA9ICIiKSwgd2lkdGggPSA2LCBoZWlnaHQgPSA1KQpwcmludChnZ3Bsb3QoZGZfRTE2X2VwaSxhZXNfc3RyaW5nKHg9Imdlbm90eXBlIix5PWkpKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpKQpkZXYub2ZmKCkKfQpgYGAKIyMjIyMgY2hlbW9raW5lczoKYGBge3IsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTd9CmZvciAoaSBpbiBjKCJDY2w1IiwiQ3hjbDEwIiwiQ3hjbDIiLCJDeGNsMSIsIlBmNCIsIkN4Y2wxMiIsIkN4Y2wxNCIsIkN4Y2wxNSIsIkN4Y2wxNiIsIkN4Y2wxNyIsIkNjbDIiLCJDY2w3IiwiQ2NsMTciLCJDY2wyMCIsIkNjbDIxYSIsIkNjbDI1IiwiQ2NsMjdhIiwiQ2NsMjgiLCJDeDNjbDEiKSkKewpwZGYoZmlsZSA9IHBhc3RlKCJNYW51c2NyaXB0L2NoZW1va2luZXNfZ2Vub3R5cGUvRTE2LyIsaSwiLnBkZiIsIHNlcCA9ICIiKSwgd2lkdGggPSA2LCBoZWlnaHQgPSA1KQpwcmludChnZ3Bsb3QoZGZfRTE2X2VwaSxhZXNfc3RyaW5nKHg9Imdlbm90eXBlIix5PWkpKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpKQpkZXYub2ZmKCkKfQpgYGAKIyMjIyMgVGgyOgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9N30KZm9yIChpIGluIGMoIklsMTAiLCJUbmYiLCJTMTAwYTgiLCJTMTAwYTkiLCJJbDYiLCJJbDE4IiwiSWwxYiIsIklsMXJsMSIsIkNjbDExIiwiQ2NsMjQiLCJJbDMzIiwiSWwyNSIsIlRzbHAiLCJGMnJsMSIsIlJldG5sYSIsIkFsb3gxNSIsIkFsb3g1IiwiR2F0YTIiLCJUZ2ZiMiIsIlRnZmIxIiwiT3JtZGwzIiwiUHRnZXMiLCJQdGdkcyIsIlB0Z3MyIiwiSHBnZHMiLCJUYnhhczEiLCJBcmVnIikpCnsKcGRmKGZpbGUgPSBwYXN0ZSgiTWFudXNjcmlwdC9UaDJfZ2Vub3R5cGUvRTE2LyIsaSwiLnBkZiIsIHNlcCA9ICIiKSwgd2lkdGggPSA2LCBoZWlnaHQgPSA1KQpwcmludChnZ3Bsb3QoZGZfRTE2X2VwaSxhZXNfc3RyaW5nKHg9Imdlbm90eXBlIix5PWkpKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpKQpkZXYub2ZmKCkKfQpgYGAKCgpgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9MTB9CmxpYnJhcnkoZ2dwdWJyKQoKZ2dwbG90KGRmX0UxNl9lcGlbIShkZl9FMTZfZXBpJHNwZWNpZmljX3R5cGU9PSJEb3VibGV0IiksXSxhZXMoZ2Vub3R5cGUsTXVjMikpK2ZhY2V0X2dyaWQoLn5zcGVjaWZpY190eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpCmBgYAoKCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMH0KCmdncGxvdChkZl9FMTZfZXBpWyEoZGZfRTE2X2VwaSRzcGVjaWZpY190eXBlPT0iRG91YmxldCIpLF0sYWVzKGdlbm90eXBlLFNmdHBiKSkrZmFjZXRfZ3JpZCgufnNwZWNpZmljX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkKYGBgCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMH0KCmdncGxvdChkZl9FMTZfZXBpWyEoZGZfRTE2X2VwaSRzcGVjaWZpY190eXBlPT0iRG91YmxldCIpLF0sYWVzKGdlbm90eXBlLFNjZ2IzYTIpKStmYWNldF9ncmlkKC5+c3BlY2lmaWNfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSkpCmBgYApgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9MTB9CgpnZ3Bsb3QoZGZfRTE2X2VwaVshKGRmX0UxNl9lcGkkc3BlY2lmaWNfdHlwZT09IkRvdWJsZXQiKSxdLGFlcyhnZW5vdHlwZSxTY2diMWExKSkrZmFjZXRfZ3JpZCgufnNwZWNpZmljX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkKYGBgCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMH0KCmdncGxvdChkZl9FMTZfZXBpWyEoZGZfRTE2X2VwaSRzcGVjaWZpY190eXBlPT0iRG91YmxldCIpLF0sYWVzKGdlbm90eXBlLFNvc3RkYzEpKStmYWNldF9ncmlkKC5+c3BlY2lmaWNfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEwfQoKZ2dwbG90KGRmX0UxNl9lcGlbIShkZl9FMTZfZXBpJHNwZWNpZmljX3R5cGU9PSJEb3VibGV0IiksXSxhZXMoZ2Vub3R5cGUsU21vYzIpKStmYWNldF9ncmlkKC5+c3BlY2lmaWNfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMH0KCmdncGxvdChkZl9FMTZfZXBpWyEoZGZfRTE2X2VwaSRjZWxsX3R5cGU9PSJEb3VibGV0IiksXSxhZXMoZ2Vub3R5cGUsTmZrYml6KSkrZmFjZXRfZ3JpZCgufmNlbGxfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKCgojIyMjIyBleHBsb3JlIGdlbmVzIGNvcnJlbGF0ZWQgd2l0aCBiYXNhbC0tPnNlY3JldG9yeSBjaGFuZ2VzOgojIyMjIyBjMyBpcyB0aGUgYmFzYWwvc2VjcmV0b3J5IHBvcHVsYXRpb24KYGBge3J9CkUxNl9EZWM3djNfZXBpIDwtIFNldEFsbElkZW50KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBpZCA9ICJyZXMuMS40IikKRTE2X0RlYzd2M19lcGlfc3ViYzM8LVN1YnNldERhdGEob2JqZWN0PUUxNl9EZWM3djNfZXBpLGlkZW50LnVzZT1jKDMpKQp0YWJsZShFMTZfRGVjN3YzX2VwaV9zdWJjM0BtZXRhLmRhdGEkcmVzLjEuNCkKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaV9zdWJjM0BtZXRhLmRhdGE8LUUxNl9EZWM3djNfZXBpX3N1YmMzQG1ldGEuZGF0YVssLXdoaWNoKG5hbWVzKEUxNl9EZWM3djNfZXBpX3N1YmMzQG1ldGEuZGF0YSkgJWluJSBjKCJyZXMuMC44IiwgInJlcy4xLjIiLCAicmVzLjEuNCIsICJyZXMuMS42IikpXSAjcmVtb3ZlIG9sZCBtZXRhZGF0YQpFMTZfRGVjN3YzX2VwaV9zdWJjMyA8LSBTY2FsZURhdGEob2JqZWN0ID0gRTE2X0RlYzd2M19lcGlfc3ViYzMpCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGlfc3ViYzMgPC0gRmluZFZhcmlhYmxlR2VuZXMob2JqZWN0ID0gRTE2X0RlYzd2M19lcGlfc3ViYzMsIGRvLnBsb3QgPSBUUlVFLCB4Lmxvdy5jdXRvZmY9MC4xLHguaGlnaC5jdXRvZmYgPSBJbmYsIHkuY3V0b2ZmID0gMC41KQpgYGAKCmBgYHtyfQpFMTZfRGVjN3YzX2VwaV9zdWJjMyA8LSBSdW5QQ0Eob2JqZWN0ID0gRTE2X0RlYzd2M19lcGlfc3ViYzMsIGRvLnByaW50ID0gRkFMU0UpClBDQVBsb3QoRTE2X0RlYzd2M19lcGlfc3ViYzMpCmBgYAoKYGBge3J9CkUxNl9EZWM3djNfZXBpX3N1YmMzIDwtIFByb2plY3RQQ0Eob2JqZWN0ID0gRTE2X0RlYzd2M19lcGlfc3ViYzMsIGRvLnByaW50ID0gVFJVRSkKYGBgCgpgYGB7cn0KUENFbGJvd1Bsb3Qob2JqZWN0ID0gRTE2X0RlYzd2M19lcGlfc3ViYzMpCmBgYApgYGB7cn0Kbi5wY3Muc3ViMyA9IDEzCmBgYAojIyMjI3Jlc29sdXRpb24gcGFyYW1ldGVyIHNldHMgdGhlIOKAmGdyYW51bGFyaXR54oCZIG9mIHRoZSBkb3duc3RyZWFtIGNsdXN0ZXJpbmcsIHdpdGggaW5jcmVhc2VkIHZhbHVlcyBsZWFkaW5nIHRvIGEgZ3JlYXRlciBudW1iZXIgb2YgY2x1c3RlcnMuIApgYGB7cn0KcmVzLnVzZWQgPC0gMS4yCmBgYAoKYGBge3J9CkUxNl9EZWM3djNfZXBpX3N1YmMzIDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSBFMTZfRGVjN3YzX2VwaV9zdWJjMywgcmVkdWN0aW9uLnR5cGUgPSAicGNhIiwgZGltcy51c2UgPSAxOm4ucGNzLnN1YjMsIAogICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uID0gcmVzLnVzZWQsIHByaW50Lm91dHB1dCA9IDAsIGZvcmNlLnJlY2FsYyA9IFQpCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGlfc3ViYzMgPC0gUnVuVFNORShvYmplY3QgPSBFMTZfRGVjN3YzX2VwaV9zdWJjMywgZGltcy51c2UgPSAxOm4ucGNzLnN1YjMsIHBlcnBsZXhpdHk9MzApCmBgYApgYGB7cn0KVFNORVBsb3Qob2JqZWN0ID0gRTE2X0RlYzd2M19lcGlfc3ViYzMsIGRvLmxhYmVsID0gVCkKYGBgCmBgYHtyfQpyZXMudXNlZCA8LSAwLjgKYGBgCmBgYHtyfQpUU05FUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaV9zdWJjMywgZG8ubGFiZWwgPSBUKQpgYGAKCmBgYHtyfQpyZXMudXNlZCA8LSAwLjYKYGBgCmBgYHtyfQpUU05FUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaV9zdWJjMywgZG8ubGFiZWwgPSBUKQpgYGAKYGBge3IsZmlnLmhlaWdodD04LGZpZy53aWR0aD0zMH0KRTE2X0RlYzd2M19lcGlfc3ViYzMgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGlfc3ViYzMsIGlkID0gInJlcy4wLjYiKQpEb0hlYXRtYXAob2JqZWN0ID0gRTE2X0RlYzd2M19lcGlfc3ViYzMsIGdlbmVzLnVzZSA9IGMoIkVwY2FtIiwiS3J0OCIsIlRycDYzIiwiS3J0NSIsIk1raTY3IiwiVG9wMmEiLCJTbW9jMiIsIkNjbDIwIiwiU29zdGRjMSIsIkJtcDciLCJDbGljMyIsIkNsZG4xMCIsIlRzcGFuMzMiLCJFaGYiLCJTZnRhMiIsIkNyaXAyIiwiTXNsbiIsIkN5cDJzMSIsIkNsZG4zIiwiQ2xkbjciLCJDbGRuNCIsIkFVMDIxMDkyIiwiVHNwYW4xIiwiQ2hhZCIsIlRzcGFuMTMiLCJLbGsxMCIsIktsazExIiwiS2xrMTMiLCJDZXMxZCIsIktydDQiLCJLcnQxMyIsIkNyZWIzbDEiKSwgCiAgICBzbGltLmNvbC5sYWJlbCA9IFRSVUUsIGdyb3VwLmxhYmVsLnJvdCA9IFRSVUUsdXNlLnNjYWxlZCA9IFQKICApCmBgYApgYGB7cn0KY29yKEUxNl9EZWM3djNfZXBpX3N1YmMzQHNjYWxlLmRhdGFbIlRycDYzIixdLCBFMTZfRGVjN3YzX2VwaV9zdWJjM0BzY2FsZS5kYXRhWyJDcmViM2wxIixdKQpgYGAKYGBge3J9CmNvcihFMTZfRGVjN3YzX2VwaV9zdWJjM0BkYXRhWyJUcnA2MyIsXSwgRTE2X0RlYzd2M19lcGlfc3ViYzNAZGF0YVsiU3BkZWYiLF0pCmBgYApgYGB7cn0KVHJwNjNfY29yPC1hcHBseShFMTZfRGVjN3YzX2VwaV9zdWJjM0BzY2FsZS5kYXRhLCAxLCBmdW5jdGlvbih4KSBjb3IoRTE2X0RlYzd2M19lcGlfc3ViYzNAc2NhbGUuZGF0YVsiVHJwNjMiLF0seCkpIApgYGAKYGBge3J9CmhlYWQoVHJwNjNfY29yKSAKYGBgCmBgYHtyfQptaW4oVHJwNjNfY29yLG5hLnJtID0gVCkgCmBgYApgYGB7cn0KVHJwNjNfY29yX29yZGVyPC1vcmRlcihUcnA2M19jb3IsZGVjcmVhc2luZz1UKSAKYGBgCmBgYHtyfQpoZWFkKFRycDYzX2NvcltUcnA2M19jb3Jfb3JkZXJdLDIwKQpgYGAKYGBge3J9CnN1bShpcy5uYShUcnA2M19jb3JbVHJwNjNfY29yX29yZGVyXSkpCmBgYApgYGB7cn0KVHJwNjNfY29yW1RycDYzX2Nvcl9vcmRlcl1bMTU3MDY6MTU2ODZdCmBgYApgYGB7cn0KdGFpbChUcnA2M19jb3JbVHJwNjNfY29yX29yZGVyXSwyMCkKYGBgCgoKCmBgYHtyfQpjb3IudGVzdChFMTZfRGVjN3YzX2VwaV9zdWJjM0BzY2FsZS5kYXRhWyJTcGRlZiIsXSwgRTE2X0RlYzd2M19lcGlfc3ViYzNAc2NhbGUuZGF0YVsiVHJwNjMiLF0sbWV0aG9kPSJwZWFyc29uIikKYGBgCgpgYGB7cn0KY29yLnRlc3QoRTE2X0RlYzd2M19lcGlfc3ViYzNAc2NhbGUuZGF0YVsiU3BkZWYiLF0sIEUxNl9EZWM3djNfZXBpX3N1YmMzQHNjYWxlLmRhdGFbIlRycDYzIixdLG1ldGhvZD0ia2VuZGFsbCIpCmBgYAoKYGBge3J9ClRycDYzX2Nvcl90ZXN0PC1hcHBseShFMTZfRGVjN3YzX2VwaV9zdWJjM0BzY2FsZS5kYXRhLCAxLCBmdW5jdGlvbih4KSBjb3IudGVzdChFMTZfRGVjN3YzX2VwaV9zdWJjM0BzY2FsZS5kYXRhWyJUcnA2MyIsXSx4LG1ldGhvZD0icGVhcnNvbiIpKSAKYGBgCmBgYHtyfQpkZl9UcnA2M19jb3JUZXN0PC1hcy5kYXRhLmZyYW1lKGRvLmNhbGwocmJpbmQsIFRycDYzX2Nvcl90ZXN0KSkKCmBgYApgYGB7cn0KZGZfb3JkZXJfVHJwNjNfY29yVGVzdDwtZGZfVHJwNjNfY29yVGVzdFtvcmRlcih1bmxpc3QoZGZfVHJwNjNfY29yVGVzdCRlc3RpbWF0ZSkpLF0KYGBgCmBgYHtyfQp0aWR5X1RycDYzX2NvcjwtY2JpbmQoZGZfb3JkZXJfVHJwNjNfY29yVGVzdCRlc3RpbWF0ZSxkZl9vcmRlcl9UcnA2M19jb3JUZXN0JHAudmFsdWUpCmBgYAoKYGBge3J9CmNvbG5hbWVzKHRpZHlfVHJwNjNfY29yKTwtYygiY29yIiwicC52YWx1ZSIpCmBgYAoKYGBge3J9CmhlYWQodGlkeV9UcnA2M19jb3IsMjApCmBgYApgYGB7cn0KdGlkeV9UcnA2M19jb3JbMTU3MDY6MTU2ODYsXQpgYGAKYGBge3J9CnRhaWwodGlkeV9UcnA2M19jb3IpCmBgYAoKYGBge3J9CktydDhfY29yX3Rlc3Q8LWFwcGx5KEUxNl9EZWM3djNfZXBpX3N1YmMzQHNjYWxlLmRhdGEsIDEsIGZ1bmN0aW9uKHgpIGNvci50ZXN0KEUxNl9EZWM3djNfZXBpX3N1YmMzQHNjYWxlLmRhdGFbIktydDgiLF0seCxtZXRob2Q9InBlYXJzb24iKSkgCmBgYAoKYGBge3J9CmRmX0tydDhfY29yVGVzdDwtYXMuZGF0YS5mcmFtZShkby5jYWxsKHJiaW5kLCBLcnQ4X2Nvcl90ZXN0KSkKCmBgYApgYGB7cn0KZGZfb3JkZXJfS3J0OF9jb3JUZXN0PC1kZl9LcnQ4X2NvclRlc3Rbb3JkZXIodW5saXN0KGRmX0tydDhfY29yVGVzdCRlc3RpbWF0ZSkpLF0KYGBgCmBgYHtyfQpzdW0oaXMubmEoZGZfb3JkZXJfS3J0OF9jb3JUZXN0JGVzdGltYXRlKSkKYGBgCgpgYGB7cn0KdGlkeV9LcnQ4X2NvcjwtY2JpbmQoZGZfb3JkZXJfS3J0OF9jb3JUZXN0JGVzdGltYXRlLGRmX29yZGVyX0tydDhfY29yVGVzdCRwLnZhbHVlKQpgYGAKCmBgYHtyfQpjb2xuYW1lcyh0aWR5X0tydDhfY29yKTwtYygiY29yIiwicC52YWx1ZSIpCmBgYAoKYGBge3J9CmhlYWQodGlkeV9LcnQ4X2NvciwyMCkKYGBgCmBgYHtyfQp0aWR5X0tydDhfY29yWzE1NjY2OjE1NzA2LF0KYGBgCgpgYGB7cn0KY29yLnRlc3QoRTE2X0RlYzd2M19lcGlfc3ViYzNAc2NhbGUuZGF0YVsiS3J0OCIsRTE2X0RlYzd2M19lcGlfc3ViYzNAbWV0YS5kYXRhJGdlbm90eXBlPT0id3QiXSwgRTE2X0RlYzd2M19lcGlfc3ViYzNAc2NhbGUuZGF0YVsiTnVtYiIsRTE2X0RlYzd2M19lcGlfc3ViYzNAbWV0YS5kYXRhJGdlbm90eXBlPT0id3QiXSxtZXRob2Q9InBlYXJzb24iKQpgYGAKYGBge3J9CmNvci50ZXN0KEUxNl9EZWM3djNfZXBpX3N1YmMzQHNjYWxlLmRhdGFbIktydDgiLEUxNl9EZWM3djNfZXBpX3N1YmMzQG1ldGEuZGF0YSRnZW5vdHlwZT09Im11dCJdLCBFMTZfRGVjN3YzX2VwaV9zdWJjM0BzY2FsZS5kYXRhWyJOdW1iIixFMTZfRGVjN3YzX2VwaV9zdWJjM0BtZXRhLmRhdGEkZ2Vub3R5cGU9PSJtdXQiXSxtZXRob2Q9InBlYXJzb24iKQpgYGAKCgoKCgoKCgoKCgoKCgoKCg==